文章目录
- flask自定义返回response
- 直接通过函数返回
- 介绍一下 `jsonify`
- 通过构建 返回对象
- 总结
- 参考文档
flask自定义返回response
Flask 框架在python web 框架中 也是比较重要的一个,工作中也使用了很长时间,这个文章对自己使用flask 一些总结。
自定义返回有两种方式
第一种通过函数 返回 , 第二种通过 make_response 构建返回对象
直接通过函数返回
看下面的例子
返回一个 三元组 即可 (body,status,headers)
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
# response body , status code reason phrase, response headers
return "<h1>This is index page!</h1>", "501 no reason", {"name": "frank", "age": 18}
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, threaded=True, debug=True)
访问页面 如下
可以看到 status 已经修改, headers 已经加入了name, age 这两个值 , content-type 这个 我并没有设置 默认返回 就是 text/html
, 这里 就是告诉浏览器,用 html 的方式 ,进行解析返回内容
有的时候 需要返回json 这种类型,可以修改 content-type 来改变 这个值
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
# response body , status code reason phrase, response headers
return {'greet': 'hello world'}, 200, {"Content-Type": "application/json"}
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, threaded=False, debug=False)
这样就可以返回 json 类型了。 图中看出好像 有content-type 是一样的值,这是因为如果 body 返回字典,默认使用 jsonify
来构建response, 在构建 response 的时候 ,会自动添加content-type 类型 . 如果 指定content-type 的话, 会自动添加到 header 头里面,所以就会重复出现相同的 content-type
所以 flask 框架 还是非常智能的, 所以 就不指定headers 就好了。
@app.route('/')
@app.route('/index')
def index():
# response body , status code reason phrase,
return {'greet': 'hello world'}, 200
介绍一下 jsonify
jsonify
对response 做了一个简单的封装, 返回类型mimetype 都是application/json
这种类型,方便我们直接使用。jsonify 中 使用 json 模块 对 body 进行 dumps 处理, 然后自定义一些 JSONDecoder
,JSONEncoder
处理一些常见的对象的编码,解码 ,如果你需要返回自己的类型 你就要继承这两个类, 然后重新 里面的方法,来自定义类型 的序列化。 因为 互联网中,很多时候 后端返回的是 json 数据,此时使用这个api ,就比较方便。 当然 也可以自定义 返回对象, 来生成Resonse 也是可以的。
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
# response body , status code reason phrase, response headers
return jsonify({"code": 1005, "data": "hello world"})
此时会把 content-type 写到 response headers 里面的。
看下代码就大概知道了
在生成 reponse 的时候 指定 mimetype 类型 就可以了. 然后通过 BaseResponse 来返回这个响应对象
Flask 核心对象 默认值 default_config
JSONEncoder
主要对日期类型, dataclass ,uuid 等一些类型 做了一些序列化处理, 下面图中红线的地方就是在做 encoder 处理
通过构建 返回对象
make_response
来构建 返回对象
第一个参数 是 body 后面的参数 会根据 传入的类型 来自动判断 是 status, 还是header
也可以传入 三元组 (body,status,header)
from flask import Flask
from flask import make_response
app = Flask(__name__)
@app.route('/')
@app.route('/index/')
def index():
xml = """<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
"""
headers = {
'Content-Type': 'text/xml',
'version': '0.0.1',
'name': 'frank',
}
# 自定义 响应体状态码,响应头
response = make_response(xml, '200 OK', headers)
return response
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, threaded=True, debug=True)
或者下面这种写法 也是可以的。
from flask import Flask
from flask import make_response
app = Flask(__name__)
@app.route('/')
@app.route('/index/')
def index():
xml = """<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
"""
# 自定义 响应体, 响应头 以及状态码
response = make_response(xml, '300 OK')
response.headers['Content-Type'] = 'text/xml'
response.headers['version'] = '0.0.1'
return response
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, threaded=True, debug=True)
这里状态码我写成300, 只是为了演示 可以自定义status,理论上 你可以任意修改里面的值, 但是来说一般 在http 协议 对不同的状态码都有相应 的定义,不可随意返回状态码。如果不是很清楚http协议,可以查询http 状态码
总结
本文简单介绍了一下 flask 如何自定义响应, 以及简单的看了一下源码的实现。 flask 是非常好用的web application 框架之一,之后我可能更多写一写 flask 一些常用的用法。
参考文档
分享快乐,留住感动. '2021-02-06 18:46:55' --frank