ele*_*ias 38 python flask flask-cache
我对.js我使用的其中一个文件进行了更改,无论我做什么,烧瓶都坚持要从内存缓存中获取文件的最后一个版本,而不进行更改.
为了澄清,我有以下结构.一切都始于foo.html
return render_template foo.html
Run Code Online (Sandbox Code Playgroud)
foo.html有一个表单内部调用flask与一些数据,然后返回第二个模板bar.html:
return render_template bar.html
Run Code Online (Sandbox Code Playgroud)
第二个模板调用.js放在static文件夹中的某个文件,但在代码更改时不会更新.
我提到了上面的结构,因为如果.js放置文件foo.html而不是bar.html然后Flask 会在文件上获取新的更改.但在bar.htmlFlask中完全忽略了它们.
怎么了?
唯一有效的方法是在浏览器上单击"禁用缓存"并重新加载.
abi*_*son 56
最终这是一个令人沮丧的浏览器缓存问题,可以通过强制浏览器进行"硬刷新"来解决,这将是一个依赖于浏览器/操作系统的击键,但通常这有效:
还有其他文件名技巧可以用来避免这个问题(在OP的评论中提到).这些在您无法控制浏览器行为的生产中尤为重要.
对于非静态Flask响应,您可以设置该cache_control.max_age属性,该属性应该告诉浏览器何时缓存响应(如果它被缓存).例如,如果您有一个返回JSON数据的Flask XHR端点,您可以这样做:
@app.route('/_get_ajax_data/')
def get_ajax_data():
data = {"hello": "world"}
response = jsonify(data)
response.cache_control.max_age = 60 * 60 * 24 # 1 day (in seconds)
return response
Run Code Online (Sandbox Code Playgroud)
您通常还可以在生产Web服务器配置中为特定资源类型设置默认值(例如CSS/JS/HTML/JSON/etc)
Yel*_*ark 13
如果您使用Flask提供静态资产(在开发环境中通常就是这种情况),那么您可能需要设置SEND_FILE_MAX_AGE_DEFAULT配置值:
默认缓存控制最大使用期限
send_static_file()(默认静态文件处理程序)和send_file()asdatetime.timedelta或秒.get_send_file_max_age()分别使用Flask或Blueprint 上的挂钩在每个文件的基础上覆盖此值.默认为43200(12小时).
解决这个问题就像更新app.config字典一样简单,如下所示:
app = Flask(__name__)
...
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
Run Code Online (Sandbox Code Playgroud)
如果这样做,您的浏览器将不会缓存Flask提供的静态资产.
Mar*_*ese 10
缓存通常是好的,所以不建议完全删除它。使用control+ F5或其他方式进行硬刷新显然不是可扩展的解决方案,因为您必须在每台计算机上的每个浏览器中都执行此操作。
一个更好的主意是让浏览器大多数时候都缓存文件,而不是在文件更新后立即缓存。 您可以通过将源文件的最后更新时间作为参数添加到其路径URL来实现。为简单起见,您可以对静态文件夹(或任何子文件夹)中的任何文件使用最新的修改时间,而不是分别查看每个文件。
def dir_last_updated(folder):
return str(max(os.path.getmtime(os.path.join(root_path, f))
for root_path, dirs, files in os.walk(folder)
for f in files))
@app.route('/my-site')
def my_site():
return render_template('my-site.html',
last_updated=dir_last_updated('mydir/static'))
Run Code Online (Sandbox Code Playgroud)
<script type="text/javascript" src="/static/my-script.js?u={{ last_updated }}"></script>
Run Code Online (Sandbox Code Playgroud)
<script type="text/javascript" src="/static/my-script.js?u=1547330602.31"></script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18173 次 |
| 最近记录: |