flask swagger 中返回图片

项目中使用了flask、flask-restful和swagger,想要在请求中返回图片并不像常规的flask项目那么简单。

修改yaml文件

由于使用了swagger,所以修改yaml文件成了必须的一步,在yaml中我们最常用的就是stirng或者json类型的返回数据,那么对于图片应该如何写呢?

1
2
3
4
5
6
7
8
responses:
200:
description: 获取成功
content:
image/png:
schema:
type: string
format: binary

其实很简单,只需要将返回的content内容设置为image/png,format设置为binary就可以了。

flask-restful的写法

这里直接给出demo代码:

1
2
3
4
5
6
url = "{}/{}/".format(CurrentConfig.APPURL, sn)
img = qrcode.make(url)
imgByteArr = io.BytesIO()
img.save(imgByteArr, format='PNG')
file = imgByteArr.getvalue()
return Response(file,mimetype="image/PNG")

本质上跟flask返回图片的方式并无不同,注意,这里不能使用send_file

关于小程序相关的验证

在和腾讯小程序对接的过程中,有一项验证就是要把腾讯给你的一个类似dbc.txt,内容为“dfgjoprtnj12312”类似的文件让你放到特定的目录下,才能通过腾讯服务器的认证。这个也是在常规的flask项目中非常容易做到,而这里因为使用了swagger,我们不能直接把文件放到某个路径下,我们可以通过响应dbc.txt请求,返回文件内容的方式来通过验证。

这里还有一个问题就是生成的swagger路径中包含.号,这在swagger中是不合法的,需要我们自己手动处理,这里给出的建议就是把.用_替代。

yaml文件:

1
2
3
4
5
6
7
8
9
/coupon/JOdezJBaLS.txt:
get:
description: none
tags:
- qrcode
responses:
200:
description: 响应成功
type: string

这里没什么问题,请求路径就是txt文件。

python文件:

1
2
3
4
5
class CouponJodezjbals_Txt(Resource):
def get(self):
return Response("dd04158d81c9249573cbf5621c67578b")

把CouponJodezjbals.Txt类名替换为CouponJodezjbals_Txt

同样的,routes文件中也需要替换:

1
2
3
4
routes = [
dict(resource=CouponJodezjbals_Txt, urls=['/coupon/JOdezJBaLS.txt'], endpoint='coupon_JOdezJBaLS_txt'),
....
]

这样就可以了。

最后一点,txt里边的内容,必须要用Response括起来,否则返回的是一串文本,不能通过腾讯的审核。