Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flaskrestful:使用GET下载带有REST的文件_Python_Rest_Flask_Flask Restful - Fatal编程技术网

Python flaskrestful:使用GET下载带有REST的文件

Python flaskrestful:使用GET下载带有REST的文件,python,rest,flask,flask-restful,Python,Rest,Flask,Flask Restful,我正在尝试编写一个公开REST接口的文件共享应用程序 我使用的库Flask RESTful只支持通过返回JSON。显然,试图通过JSON提供二进制数据并不是一个好主意 通过GET方法提供二进制数据的最“RESTful”的方式是什么?RESTful似乎可以支持返回除JSON之外的不同数据表示形式,但文档很少,我不确定这是否是最好的方法。只要您相应地设置内容类型标题,并尊重客户端发送的接受标题,你可以自由返回任何你想要的格式。您只需要有一个视图,该视图使用应用程序/octet流内容类型返回二进制数据

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

我使用的库Flask RESTful只支持通过返回JSON。显然,试图通过JSON提供二进制数据并不是一个好主意


通过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年第一次提交以来,文档中讨论响应格式的部分几乎没有更新。既然你提到了,在我期末考试之后,我会做一个公关,并根据这个答案更新那部分文档。