七天学会flask(六)---响应对象response
响应对象response
flask提供了Response最为视图最终返回的数据,但在代码编写过程中,我们通常很少直接使用Response对象,下面是几个常见的视图返回数据的方式
from flask import Flask, jsonify, render_template, Response app = Flask(__name__) @app.route('/text') def get_text(): return '返回文本' @app.route('/dict') def get_dict(): return {'state': 0} @app.route('/json') def get_json(): return jsonify({'state': 0}) @app.route('/html') def get_html(): return render_template('index.html') @app.route('/response') def get_resonponse(): return Response('Not Found', status=404) if __name__ == '__main__': app.run(debug=True)
- get_text 返回一个字符串
- get_dict 返回一个字典
- get_json 返回一个json格式的字符串
- get_html 返回一个模板
- get_resonponse 返回一个Response对象
使用谷歌浏览器来查看这几个http响应的类型,1, 4, 5 的Content-Type 是 text/html,2,3的Content-Type 是application/json。这说明,flask会根据视图函数的返回值类型,来决定最终的Content-Type。
2. 利用Response返回图片
如果你的一个接口需要返回图片数据,那么就可以直接构造Response对象
@app.route("/image") def image(): f = open("static/public/pic/coolpython.png", 'rb') resp = Response(f.read(), mimetype="image/jpeg") return resp
如果不直接创建Response对象,那么你就无法设置mimetype首部
3. 自定义Response
你还可以自己定义一个Response类,做一些个性化的处理,但这个类必须继承Response
class ImageResponse(Response): default_mimetype = 'image/jpeg' @app.route("/image") def image(): f = open("static/public/pic/coolpython.png", 'rb') resp = ImageResponse(f.read()) return resp
我自定义的ImageResponse类里,default_mimetype 就是image/jpeg, 因此在视图中创建ImageResponse对象时无需再设置mimetype。
4. 替换response_class
flask对象有一个response_class属性,默认是Response,你可以将其替换成自定义的响应类,假设你要实现一个图片服务,返回的数据都是图片,mimetype都是image/jpeg,那么你可以这样做
class ImageResponse(Response): default_mimetype = 'image/jpeg' app = Flask(__name__) app.response_class = ImageResponse @app.route("/image") def image(): f = open("static/public/pic/coolpython.png", 'rb') return f.read()
在image函数,直接返回从图片中读取的数据返回,这些数据最终会被ImageResponse类处理