关于响应(Response)
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下:
1、如果返回的是一个合法的响应对象,则直接返回。
2、如果返回的是一个字符串,那么Flask会重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。
3、如果返回的是一个元组,元祖中的数据类型是(response,status,headers)。status值会覆盖默认的200状态码,headers可以是一个列表或者字典,作为额外的消息头。
4、如果以上条件都不满足,Flask会假设返回值是一个合法的WSGIt应用程序,并通过Response.force_type(rv,request.environ)转换为一个请求对象
我们可以通过Response和make_response函数来创建响应对象,另外我们也可以通过返回元组和自定义响应来进行返回,具体内容可以参考一下文章(以上内容参考自以下文章,如有侵权,请联系作者进行删除)
Flask | Flask基础 - 关于响应Response的浅析
当服务端需要返回图片时,就需要使用Response或者make_进行自定义返回.make_response方法要优于Response方法,这是因为该方法可以设置额外的数据,比如设置cookie,header信息等。
例如当用户请求服务器,要求返回一张图片并同时把该图片的清晰度返回时,就需要使用make_response返回数据,在主体中返回图片,在response的headers中返回清晰度信息,示例如下:
import cv2
from flask import Flask, make_response
import os
from turbojpeg import TurboJPEG
app = Flask(__name__)
image_focus = 14521.6
def load_turbojpeg():
basePath = os.path.split(os.path.realpath(__file__))[0]
TurboJPEGPath = basePath + '\\turbojpeg.dll'
turbojpeg = TurboJPEG(TurboJPEGPath)
return turbojpeg
turbojpeg = load_turbojpeg()
@app.route("/image")
def index():
image = cv2.imread('./image/0010.jpg')
#转换为JPEG格式
jpeg = turbojpeg.encode(image)
#创建response对象
resp = make_response(jpeg)
#设置response的headers对象
resp.headers['Content-Type'] = 'image/jpeg'
resp.headers['image-focus'] = image_focus
return resp
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=8000)
启动服务,当用户访问[http://127.0.0.1:8000/image]时,会返回服务器根目录中/image/0010.jpg这张图片.
HTTP响应报文
Content-Length:1238664
Content-Type:image/jpeg
Date:Sat, 18 Apr 2020 08:23:39 GMT
image-focus:14521.6
Server:Werkzeug/0.16.0 Python/3.6.9
返回的类型为image/jpeg
以下为测试结果图: