Flask-RESTful:使用 GET 下载带有 REST 的文件

Ayr*_*yrx 6 python rest flask flask-restful

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

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

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

小智 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
Run Code Online (Sandbox Code Playgroud)

这个表示函数的作用是将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
        }
Run Code Online (Sandbox Code Playgroud)

这就是我们需要的所有编码。发送此GET请求时,我们需要将Acceptmimetype更改为,Application/octet-stream以便我们的 API 调用表示函数。否则,它将默认返回 JSON 数据。

githubxml上有一个例子

我知道这个问题是 7 年前提出的,所以对@Ayrx 来说可能不再重要了。希望对路过的人有所帮助。

  • 感谢您通过示例代码给出的准确答案。这很有帮助并节省了时间。我想知道为什么restful文档中没有具体的例子。 (2认同)

Ped*_*eck 5

只要您Content-Type相应地设置标题并尊重Accept客户端发送的标题,您就可以自由地返回您想要的任何格式。您可以只拥有一个返回带有application/octet-stream内容类型的二进制数据的视图。