服务blob

时间:2018-04-26 12:00:23

标签: python google-app-engine python-requests google-cloud-storage blobstore

在我基于Flask的Google App Engine服务器中,我正在尝试返回一个内容长度为'的回复。标题将包含提供给客户端的blob的最终大小。此blob是一个大型媒体文件,因此该标头将用于设置UI前端上进度条的最大值。 blob存在于Cloud Storage中,但是正在使用App Engine包中的blobstore API来检索blob。以下返回时显示200状态代码:

response.headers['Content-length'] = blobstore.BlobInfo(version.blob_key).size
return response

正在使用Requests Python package接收,并正在流式传输正在接收的数据(This should be fine, since all the headers are received in the Response object first before data streaming begins)。我的代码如下所示:

with requests.get(url='/api/download', stream=True) as r:
    print(r.headers)

但是,没有设置Content-length标头。相反,我从上面的print()获得了类似的内容:

{'Cache-Control': 'no-cache', 
 'Content-Type': 'text/plain; charset=utf-8', 
 'X-Cloud-Trace-Context': '1bca54f9cdae7394de6cb2f1e824ba6f', 
 'Transfer-Encoding': 'chunked',
 'Date': 'Thu, 26 Apr 2018 11:36:17 GMT',
 'Server': 'Google Frontend'}

我从this post注意到App Engine剥离了内容长度标题并用正确的大小替换它,但我没有得到内容长度标题。我做错了什么?我为客户服务blob错了吗?内容长度是否完全不可用且无法设置?如果是这样,我如何检索文件的大小,以便我可以计算UI进度条的大小?

1 个答案:

答案 0 :(得分:1)

Content-Length标题包含在list of headers that can't be modified中。

正如您和文档所指出的,App Engine会根据请求数据计算Content-Length标头,并在发送之前将其添加到请求中。

您可以随时设置个性化标题,Flask允许,GAE允许您使用它。

例如,您的回复:

response.headers['CL-blob'] = blobstore.BlobInfo(version.blob_key).size