flask-基础篇02 请求与响应
2024-10-21 15:33:58
一、处理请求
1、URL路径参数(动态路由)
# 例如,有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息。此时如何从url中提取出123的数据? @app.route("/user/<user_id>")
def user_info(user_id):
print(user_id)
return "hello user {}".format(user_id) # 上面<>是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、并以字符串为数据类型、user_id 为参数名传视图。
2、Flask提供的其他的转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
将上面的例子以整形匹配数据,可以如下使用:
@app.route('/user/<int:user_id>')
def user_info(user_id):
print(type(user_id))
return "hello world {}".format(user_id)
3、自定义转换器
问题:如果遇到需要匹配提取 /sms_codes/13886555555 中的手机号数据,Flask内置的转换器将无法满足,此时需要自定义转换器。
定义方法(分为三步)
# 第一步、创建转换器类,保存匹配的正则表达式
from werkzeug.routing import BaseConverter class MobileConverter(BaseConverter):
"""
手机号码格式
"""
regex = r"1[3-9]\d{9}" # 注意 regex 名字是固定的 # 第二步、将自定义的转换器告知Flask应用
app = Flask(__name__) # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为:mobile
app.url_map.converters["mobile"] = MobileConverter # 第三步、在使用转换器的地方定义使用
@app.route('/sms_codes/<mobile:mob_num>')
def send_sms_code(mob_num):
return "send sms code to {}".format(mob_num)
4、其他参数
如果想要获取其他地方传递的参数,可以通过Flask提供的 request 对象来读取。
不同位置的参数都存放在request的不同属性中
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
5、例如 想要获取请求 /articles??channel_id=1 中 channel_id 的参数,可以按如下方式使用:
from flask import request @app.route('/reticles')
def get_reticles():
channel_id = request.args.get("channel_id")
return 'you wanna get articles of channel {}'.format(channel_id)
6、上传图片
客户端上传图片到服务器,并保存到服务器中
from flask import request @app.route('/upload', methods=['POST'])
def upload_file():
f = request.files["pic"] # 图片的键是 pic
# with open("./demo.png", "wb") as new_file:
# new_file.write(f.read())
f.save(./demo.png)
return "ok"
二、处理响应
需求:如何在不同的场景里返回不同的响应信息?
1、返回模板
使用 render_template 方法渲染模板并返回,例如下,新建一个模板 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>
后端视图
from flask import render_template @app.route("/")
def index():
mstr = "Hello World"
mint = 10
render render_template("index.html", my_str=mstr, my_int=mint) # 如果是一个字典,也可以这样
@app.route("/")
def index():
my_info = {
"mstr":"Hello World"
"mint":10}
render render_template("index.html", **my_info)
2、重定向
# 将一个路由重定向到百度首页
from flask import redirect @app.route("/demo2")
def demo2():
return redirect("http://www.baidu.com")
3、返回json
from flask import jsonify @app.route("/demo3")
def demo3():
json_dict = {
"user_id": 10,
"user_name": "huofei"
}
return jsonify(json_dict)
4、自定义状态码和响应头
①元祖方式
可以返回一个元组,这样的元组必须是(request, status, headers)的形式,且至少包含一个元素。status 值会覆盖状态代码,headers可以是一个列表 或字典,作为额外的消息头值,实现代码如下:
@app.route("/demo4")
def demo4():
# return '状态为 666', 666
# return "状态码为 666", 666, [("name", "huofei")]
return "状态吗为 666", 666, {"name": "huofei"}
②make_response方式
@app.route("/demo5")
def demo5():
resp = make_response("make response测试")
resp.headers["name"] = "huofei"
resp.status = "404 not found"
return resp
三、Cookie
如何设置?如下代码:
from flask import Flask, make_response app = Flask(__name__) @app.route("/cookie")
def set_cookie():
resp = make_response("set cookie ok")
resp.set_cookie("username", "huofei")
return resp
设置有效期
@app.route("/cookie")
def set_cookie():
response = make_response('hello world')
# 设置有效期为3600秒
response.set_cookie("username", "huofei", max_age=3600)
return response
读取
from flask import request @app.route("/get_cookie")
def get_cookie():
resp = request.cookie.get("username")
return resp
删除
# 删除的原理是将cookie的有效期修改为1970年了
from flask import request @app.route("/delete_cookie")
def delete_cookie():
response = make_response("hello world")
response.delete_cookie("username")
return response
四、Session
1、需要先设置SECRET_KEY,如下
class DefaultConfig(object):
SECRET_KEY = "fq3rfdsqdsaDFAdDAF" app.config.from_object(DefaultConfig) # 或者直接设置
app.secret_key = "abc1dsfq23321adaaf"
2、设置
from flask import session @app.route("/set_session")
def set_session():
session["username"] = "huofei"
return "set session Ok"
3、读取
@app.route("/get_session")
def get_session():
username = session.get("username")
return "get session username {}".format(username)
最新文章
- PCB的封装尺寸
- extends 和 implements
- Windows Server 2012之搭建域控制器DC
- 游戏设计模式:Subclass Sandbox模式,以及功能方法集的设计思考
- ECMall关于数据查询缓存的问题
- 在 Java 中高效使用锁的技巧--转载
- java常识和好玩的注释
- hdu1060 Leftmost Digit---求N的N次方的首位(对数)
- !!在js中的用法
- 【Teradata】并行操作工具
- C++ Primer 笔记——数组
- CSS样式简介
- Linux小技巧之:两种方法统计访问web网站的前10个IP
- python练习题-day4
- python ----字符串基础练习题30道
- 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码
- 【转载】全栈工程师-Hadoop, HBase, Hive, Spark
- 为何在JDK安装路径下存在两个JRE?
- Golang template和junit xml report转html工具
- JS-获取图片地址
热门文章
- MYSQL启动:&#39;服务没有相应控制功能&#39;问题解决
- SSB调制与解调(Simulink&;Matlab)
- C#笔记誊录
- uni-app学习笔记之----getCurrentPages()的使用
- WPF学习笔记-数据采集与监控项目02-主界面(页面切换,抽屉侧滑栏效果)
- python 操作 ES 二、mappings
- 如何为 Debian 11 安装图形用户界面 (GUI)
- zabbix利用python3脚本进行钉钉报警
- Scrapy之Request函数回调未执行 Filtered offsite request to &#39;XXX&#39;
- Android NDK build vsomeip3