Flask的send_from_directory中文件缓存的问题

逆旅 2022-08-03T21:02:37

1.遇到的问题

在查看网站的站点地图时,sitemap.xml文件无法及时更新
源码为:

@app.route('/sitemap.xml')
def sitemap():
    return send_from_directory(app.static_folder, 'sitemap.xml')

2.解决过程

查看Nginx日志,发现有访问记录,但是Flask日志没有访问记录,推测是Nginx缓存了文件,再进一步研究 Responses Header。

ache-control: max-age=43200
cache-control: no-cache
content-length: 232
content-type: text/xml; charset=utf-8
date: Thu, 22 Jul 2021 13:34:46 GMT
etag: "1626957430.2692862-232-1924272348"
expires: Fri, 23 Jul 2021 01:34:46 GMT
last-modified: Thu, 22 Jul 2021 12:37:10 GMT
server: nginx
x-cache: HIT

应该要修改 Responses Header参数

3.解决办法

这里主要修改Flask程序的 Responses Header

3.1解决办法一

send_from_directory主要继承了send_file方法,有如下参数

flask.send_file(filename_or_fp,  add_etags=True,cache_timeout=None, conditional=False, last_modified=None)
add_etags set to False to disable attaching of etags.
cache_timeout the timeout in seconds for the headers. When None (default), this value is set by : meth:~Flask.get_send_file_max_age of: data:~flask.current_app.
last_modified set the Last-Modified header to this value, a : class:~datetime.datetime or timestamp. If a file was passed, this overrides its mtime.

修改后:

@app.route('/sitemap.xml')
def sitemap():
    return send_from_directory(app.static_folder, 'sitemap.xml',
    cache_timeout=-1,add_etags=False,last_modified=None)

3.2解决办法二

使用make_response方法:

@app.route('/sitemap.xml')
def sitemap():
    res = make_response(open('static/sitemap.xml').read())
    res.headers['content-type'] = 'text/xml; charset=utf-8'
    return res

注意:Nginx缓存也要清理一次

最后修改: 2022-08-03T21:02:37

版权声明:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)

comment 评论

验证图片
评论
仿 Valine