Content-length header 未针对服务 blob 的 Flask App Engine 响应设置

Content-length header not being set on Flask App Engine response for served blob

在我的 Flask-based Google App Engine 服务器中,我正在尝试 return 包含最终大小的 'content-length' header 的响应提供给客户端的 blob。此 blob 是一个大型媒体文件,因此此 header 将用于设置 UI 前端进度条的最大值。 blob 位于 Cloud Storage 中,但使用 App Engine 包中的 blobstore API 来检索 blob。 return 秒以下,状态代码为 200

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

正在使用 Requests Python package, and is streaming the data being received (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 header。相反,我从上面的 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 header 并用正确的大小替换它,但我没有得到 content-length header 开头。我做错了什么?我是否错误地将 blob 服务给客户? content-length 是否根本不可用且无法设置?如果是这样,我如何检索文件的大小以便计算 UI 进度条的大小?

Content-Length header 包含在 list of headers that can't be modified.

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

你总是可以设置一个个性化的header,Flask允许它,而GAE会让你使用它。

例如,对于您的回复:

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