Flask-RESTful:使用GET通过REST下载文件

时间:2013-11-10 10:15:20

标签: python rest flask flask-restful

我正在尝试编写一个公开REST接口的文件共享应用程序。

我正在使用的库,Flask-RESTful仅支持通过default返回JSON。显然,尝试通过JSON提供二进制数据根本不是一个好主意。

通过GET方法提供二进制数据的最“RESTful”方式是什么? extend Flask-RESTful似乎可以支持返回除JSON之外的不同数据表示,但文档很少,我不确定它是否是最好的方法。

3 个答案:

答案 0 :(得分:7)

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 转换为具有 mimetype Responseapplication/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 来说可能不再重要了。希望对路过的人有所帮助。

答案 1 :(得分:3)

只要您相应地设置Content-Type标头并尊重客户端发送的Accept标头,您就可以随意返回所需的任何格式。您可以使用一个视图返回包含application/octet-stream内容类型的二进制数据。

答案 2 :(得分:0)

经过大量的试验和实验,包括数小时的浏览,使 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

更改您的文件名和内容类型以支持您想要的格式。