flask自定义返回response

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) 

访问页面 如下

img-01

可以看到 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

img-01-01

所以 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 里面的。

img-01-02

看下代码就大概知道了

在生成 reponse 的时候 指定 mimetype 类型 就可以了. 然后通过 BaseResponse 来返回这个响应对象

img01-03

Flask 核心对象 默认值 default_config 0

JSONEncoder 主要对日期类型, dataclass ,uuid 等一些类型 做了一些序列化处理, 下面图中红线的地方就是在做 encoder 处理

img-01-02

通过构建 返回对象

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)

img-02-2

或者下面这种写法 也是可以的。

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 状态码

img-02

总结

本文简单介绍了一下 flask 如何自定义响应, 以及简单的看了一下源码的实现。 flask 是非常好用的web application 框架之一,之后我可能更多写一写 flask 一些常用的用法。

参考文档

Flask 设置个性化的响应体、响应头、状态码

quickstart/#about-responses

http-content-type

分享快乐,留住感动. '2021-02-06 18:46:55' --frank
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值