gpt4 book ai didi

python - 如何修改web2py下载函数以在文件没有更改的情况下返回 "304 Not Modified"?

转载 作者:行者123 更新时间:2023-12-01 05:50:27 24 4
gpt4 key购买 nike

就我而言,我有一个数据库,其中包含显示在概述页面上的文档缩略图。每次浏览器访问该站点时,所有缩略图都会再次下载,因此下载功能会再次加载数据库中的所有图像。由于我在 GAE 上运行,这会增加我的数据库读取量。

我尝试通过设置启用客户端站点缓存:

@auth.requires_login()
def download():
response.headers['Cache-Control'] = None
response.headers['Pragma'] = None
response.headers['Expires'] = None
return response.download(request, db)

我还读到,response.stream 可能有帮助,但 web2py 书说:

As noted above, response.download should be used to retrieve files stored via an upload field. response.stream can be used in other cases, such as returning a temporary file or StringIO object created by the controller.

-- 编辑--

我启用了客户端缓存:

session.forget() #important
expire_time = datetime.timedelta(days=2)

response.headers['Cache-Control'] = 'private, max-age%d'%(60*60*24*2)
response.headers['Pragma'] = None
response.headers['Expires'] = (request.utcnow + expire_time).strftime("%a, %d %b %Y %H:%M:%S GMT")
response.headers['Content-Disposition'] = \
'attachment;filename=' + filename + ';'

return response.stream(stream, filename=filename)

最佳答案

首先,如果图像是公开可用的并且不需要身份验证即可查看,那么您可以将它们存储在/static 文件夹中,而不是将它们存储在/uploads 文件夹中,然后将它们简单地作为静态文件提供。在这种情况下,将自动为客户端缓存设置 header (它也会更快、更高效)。

其次,您可以使用 response.stream() 流式传输上传的文件,但它不会自动识别文件所在的文件夹,也不会从编码的文件名中解码原始文件名并添加它到 Content-Disposition header (在这种情况下您无论如何都不需要它,因为您正在显示图像而不是下载它们)。因此,只要将完整文件路径传递给 response.stream(),您就应该能够在这种情况下使用它,并且它将适本地设置响应 header 以进行缓存。

最后,如果你想直接设置响应头,那就是这样的:

import os
import time
modified = os.stat(file)[stat.ST_MTIME]
mtime = time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(modified))
response.headers['Last-Modified'] = mtime
response.headers['Pragma'] = 'cache'
response.headers['Cache-Control'] = 'private'

关于python - 如何修改web2py下载函数以在文件没有更改的情况下返回 "304 Not Modified"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14515313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com