我正在尝试编写一个公开 REST 接口的文件共享应用程序。
我使用的库,Flask-RESTful默认只支持返回 JSON 。显然,尝试通过 JSON 提供二进制数据根本不是一个好主意。
通过 GET 方法提供二进制数据的最“RESTful”方式是什么?似乎可以扩展Flask-RESTful 以支持返回除 JSON 之外的不同数据表示,但文档很少,我不确定它是否是最好的方法。
Flask-RESTful 文档中建议的方法是在 Api 对象上声明我们支持的表示,以便它可以支持其他媒体类型。我们正在寻找的媒体类型是application/octet-stream
.
首先,我们需要编写一个表示函数:
from flask import Flask, send_file, safe_join
from flask_restful import Api
app = Flask(__name__)
api = Api(app)
@api.representation('application/octet-stream')
def output_file(data, code, headers):
filepath = safe_join(data["directory"], data["filename"])
response = send_file(
filename_or_fp=filepath,
mimetype="application/octet-stream",
as_attachment=True,
attachment_filename=data["filename"]
)
return response
这个表示函数所做的是将data, code, headers
我们的方法返回转换为Response
具有 mimetype 的对象application/octet-stream
。这里我们使用send_file
函数来构造这个Response
对象。
我们的GET
方法可以是这样的:
from flask_restful import Resource
class GetFile(Resource):
def get(self, filename):
return {
"directory": <Our file directory>,
"filename": filename
}
这就是我们需要的所有编码。发送此GET
请求时,我们需要将Accept
mimetype更改为,Application/octet-stream
以便我们的 API 调用表示函数。否则它将默认返回 JSON 数据。
github上有一个xml
例子
我知道这个问题是 7 年前提出的,所以对@Ayrx 来说可能不再重要了。希望对路过的人有所帮助。
只要您相应地设置Content-Type
标头并尊重Accept
客户端发送的标头,您就可以自由地返回您想要的任何格式。您可以只拥有一个返回具有application/octet-stream
内容类型的二进制数据的视图。
经过大量的试验和实验,包括数小时的浏览以使 Response 类成为单一责任下载器
class DownloadResource(Resource):
def get(self):
item_list = dbmodel.query.all()
item_list = [item.image for item in item_list]
data = json.dumps({'items':item_list})
response = make_response(data)
response.headers['Content-Type'] = 'text/json'
response.headers['Content-Disposition'] = 'attachment; filename=selected_items.json'
return response
更改您的文件名和内容类型以支持您想要的格式。