请求处理-request对象
在视图函数中,flask并不需要使用一个参数来接收请求对象,这点和django的 视图函数是不一样的。
flask如果要使用请求对象,直接导入从from flask import request
变量就可以了
request是一个LocalPorxy实例,每个请求、不同的视图函数都是相互隔离的。
与django的对比
flask视图函数使用请求对象:
from flask import Flask, request
@app.route("/userinfo")
def user_info():
print(request)
return "user-info"
django视图函数使用请求对象:
# django使用request对象,需要在视图函数中第一个参数接收request
def user_info(request: HttpRequest):
print(request)
return HttpResponse("user-info")
# 绑定路由
urlpattern = [
path("userinfo/", user_info)
]
请求对象的基本属性获取
from flask import Flask, request
@app.route("/userinfo")
def user_info():
# 请求的url地址
print(request.url) # http://127.0.0.1:5000/demo1
# 请求的ip地址
print(request.remote_addr)
# 获取请求头
print(request.headers) # headers是字典
# 获取请求方式
print(request.method)
return "user-info"
请求参数获取
get请求:request.args
post请求:
- 表单:
request.form
- 文件:
request.files
- json:
request.json
@app.route('/demo2', methods=["post", "get"])
def demo2():
# 获取GET请求的请求参数(查询字符串) ,request.args
print(f"{request.args=}") # django是request.GET DRF是request.query_param
# 获取表单数据, request.form
print(f"{request.form=}") # django是request.POST DRF是request.data
# 获取json, request.json
if request.is_json:
print(f"{request.json=}") # django是request.body然后需要json.loads DRF是request.data
# 获取文件类型
print(f"{request.files=}") # django是request.FILES DRF也是request.FILES(应该没记错..)
user_upload_img = request.files.get("img")
if user_upload_img:
# 获取上传文件的文件名
print(user_upload_img.filename)
# 保存文件到本地
# 不过一般实际开发大部分都是保存到云(阿里云oss?七牛云),或者保存到分布式存储?minio这类。
user_upload_img.save("./1.png")
return "request获取请求参数"
请求常用参数
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录GET请求中的查询参数,如?name=zhangsan&age=18 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
响应处理-response对象
flask中返回响应的方式
直接返回字符串
- 直接返回字符串,(会自动包装成Response对象)
@app.route("/demo1")
def demo1():
return "访问静态资源"
通过模板渲染返回
- 使用模板渲染返回,使用render_template()函数
@app.route("/demo2")
def demo2():
# 使用render_template渲染,可以传递上下文,这个和django是一样的
# index.html是项目目录下的templates目录中寻找
return render_template("index.html", username="张三")
重定向
- 重定向,使用redirect()函数
from flask import Flask, redirect
@app.route('/demo3')
def demo3():
# 重定向到其他网站
# return redirect(location="http://www.baidu.com", code=302)
# 重定向到内部路由
return redirect(location="/demo1")
返回json
- 返回json,使用jsonify()函数(和js的名字差不多...)
from flask import Flask, jsonify
@app.route('/demo4')
def demo4():
data = {
"username": "张三",
"age": 18,
"hobby": ["篮球", "足球"]
}
return jsonify(data)
json返回中文默认会进行ascii编码,如果想直接显示中文,则需要设置:
# flask 2.2之前:
# app.config["JSON_AS_ASCII"] = False
# flask 2.2之后。原因:2.2提供了一个JsonProvider : https://github.com/pallets/flask/pull/4692
# 拓展:使用orjson,这个json库比较好的样子?速度更快?有空看看。https://www.jb51.net/article/250451.htm
# 这两种方式都可以,因为一个是json类,一个是json类的具体实例,相对应修改的是类属性、实例属性,所以都有效果。
app.json_provider_class.ensure_ascii = False
app.json.ensure_ascii = False
make_response函数返回
- 使用make_response函数返回响应
@app.route('/demo6')
def demo6():
# 可以把字符串传进去
# response = make_response("我是响应体")
# 也可以渲染模板后丢进去make_response()函数中再返回
# response = make_response(render_template("index.html", username="wangwu"))
# 还也可以搞个json
response = make_response(jsonify({
"username": "张三",
"age": 18,
"hobby": ["篮球", "足球"]
}))
return response
通过元组形式返回
-
使用元组方式,按照一定格式进行返回响应,会自动包装成Response对象
元素格式:
(响应体内容, 状态码, 响应头)
# 自定义相应和相应状态码
@app.route('/demo5')
def demo5():
# 直接返回一个元组,元组里面的(响应体内容, 状态码, 响应头)
# 响应头中文不支持,需要编码成utf8
return "我是响应体", 999, {"user": quote("哈师大合适的".encode('utf-8'))}
响应状态码设置
只需要设置响应对象Response中属性status_code
# 通过make_response()函数设置
response = make_response("oh, shit!!!")
# 当然,通过jsonify()函数返回的也是response对象,同样也可以用变量接收并设置status_code
# response = jsonify(data)
response.status_code = 201
return response
# 通过元组方式返回并设置
return "你好!", 400, {}
响应头设置
response.headers本身是一个字典,直接按字典的方式来设置响应头。
from urllib.parse import quote
response.headers["Content-Type"] = "application/json;charset=UTF-8"
# response.headers.set("username", "哈师大合适的")
# 中文请求头会编码报错,要用utf8编码一下,django的不会....
response.headers.set("username", quote("哈师大合适的".encode('utf-8')))
标签:return,请求,对象,request,响应,json,flask,response
From: https://www.cnblogs.com/juelian/p/17742115.html