烧瓶看不到.js文件的变化

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

最终这是一个令人沮丧的浏览器缓存问题,可以通过强制浏览器进行"硬刷新"来解决,这将是一个依赖于浏览器/操作系统的击键,但通常这有效:

  • Windows:Ctrl + F5
  • Mac:Cmd + Shift + R.
  • Linux:Ctrl + Shift + R.

还有其他文件名技巧可以用来避免这个问题(在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()as datetime.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)

Jinja模板

<script type="text/javascript" src="/static/my-script.js?u={{ last_updated }}"></script>
Run Code Online (Sandbox Code Playgroud)

HTML结果

<script type="text/javascript" src="/static/my-script.js?u=1547330602.31"></script>
Run Code Online (Sandbox Code Playgroud)

  • 这是有趣的、原创的、有效的方法。+1 (2认同)
  • 太好了,我喜欢!谢谢:) +1 (2认同)
  • 非常巧妙的方法来做到这一点! (2认同)