Flask 返回图片及其图片的附加信息

关于响应(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

以下为测试结果图:


image.png

你可能感兴趣的:(Flask 返回图片及其图片的附加信息)