【问题标题】:Content-length header not being set on Flask App Engine response for served blob未在 Flask App Engine 响应中为服务的 blob 设置内容长度标头
【发布时间】:2018-10-07 02:55:28
【问题描述】:

在我基于 Flask 的 Google App Engine 服务器中,我试图返回一个带有“content-length”标头的响应,该标头将包含提供给客户端的 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 去除了 content-length 标头并将其替换为正确的大小,但我一开始没有得到 content-length 标头。我做错了什么?我是否将 blob 提供给客户错误?内容长度是否根本不可用且无法设置?如果是这样,我如何检索文件的大小,以便计算我的 UI 进度条的大小?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2015-01-29
      • 2014-11-09
      • 1970-01-01
      相关资源
      最近更新 更多