Python flaskrestful:使用GET下载带有REST的文件
我正在尝试编写一个公开REST接口的文件共享应用程序 我使用的库Flask RESTful只支持通过返回JSON。显然,试图通过JSON提供二进制数据并不是一个好主意Python flaskrestful:使用GET下载带有REST的文件,python,rest,flask,flask-restful,Python,Rest,Flask,Flask Restful,我正在尝试编写一个公开REST接口的文件共享应用程序 我使用的库Flask RESTful只支持通过返回JSON。显然,试图通过JSON提供二进制数据并不是一个好主意 通过GET方法提供二进制数据的最“RESTful”的方式是什么?RESTful似乎可以支持返回除JSON之外的不同数据表示形式,但文档很少,我不确定这是否是最好的方法。只要您相应地设置内容类型标题,并尊重客户端发送的接受标题,你可以自由返回任何你想要的格式。您只需要有一个视图,该视图使用应用程序/octet流内容类型返回二进制数据
通过GET方法提供二进制数据的最“RESTful”的方式是什么?RESTful似乎可以支持返回除JSON之外的不同数据表示形式,但文档很少,我不确定这是否是最好的方法。只要您相应地设置
内容类型
标题,并尊重客户端发送的接受
标题,你可以自由返回任何你想要的格式。您只需要有一个视图,该视图使用应用程序/octet流
内容类型返回二进制数据。Flask RESTful文档中建议的方法是在Api对象上声明我们支持的表示形式,以便它可以支持其他媒体类型。我们正在寻找的媒体类型是application/octet-stream
首先,我们需要编写一个表示函数:
从烧瓶导入烧瓶,发送文件,安全加入
从restful导入Api
app=烧瓶(名称)
api=api(应用程序)
@api.representation('应用程序/八位字节流')
def输出_文件(数据、代码、标题):
filepath=safe_join(数据[“目录”],数据[“文件名”])
响应=发送文件(
filename\u或\u fp=filepath,
mimetype=“应用程序/八位字节流”,
如附件=真,
附件\文件名=数据[“文件名”]
)
返回响应
此表示函数的作用是将我们的方法返回的数据、代码、标题
转换为具有mimetype应用程序/octet流的响应
对象。这里我们使用send\u file
函数来构造这个响应
对象
我们的GET
方法可以是:
来自flask\u restful导入资源
类GetFile(资源):
def get(自我,文件名):
返回{
“目录”:,
“文件名”:文件名
}
这就是我们需要的所有编码。发送此GET
请求时,我们需要将Accept
mimetype更改为Application/octet-stream
,以便API调用表示函数。否则,它将默认返回JSON数据
上有一个xml
示例
我知道这个问题是7年前提出的,所以对@Ayrx来说可能不再重要了。希望它能帮助路过的人。经过大量的试验和实验,包括几个小时的浏览,使响应类成为一个负责任的下载器
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
更改文件名和内容类型以支持所需的格式。这是一个非常广泛的问题。你很安静。没有什么能阻止你从头开始建设。如果数据是静态的,那么最好使用web服务器来处理。你能补充一些细节吗?谢谢你用示例代码给出了准确的答案。这帮了大忙,节省了时间。我想知道为什么restful文档中没有具体的例子。@VinojJohnHosan我只是看了一下Flask restful存储库。整个项目似乎没有得到很积极的维护,我想这是因为这个库的使用率低。自2012年第一次提交以来,文档中讨论响应格式的部分几乎没有更新。既然你提到了,在我期末考试之后,我会做一个公关,并根据这个答案更新那部分文档。