我遇到了在Heroku上托管的django 1.4网站的问题。我们使用Memcache进行各种缓存,比如模板和静态资产缓存。 [更新:根据django docs,django似乎没有使用memcache进行模板加载缓存]
有时当我将网站推送到heroku时,静态css文件的链接不会更新,直到缓存清除(手动或我猜测它何时超时,因为它似乎在几分钟后自行修复,如果我不管它了。
所以这是不可接受的,因为我的HTML是新版本,我的css将是旧版本,直到缓存更新并且url更改为新的css文件。
示例:
该网站有html(我们称之为v1)并链接到css文件,如: application.5e6e7ad87005.css
我对application.css文件进行了更改并推送了该站点。这会导致静态文件的内容生成一个新的css文件名,让我们说: application.5e6e7ad87006.css
问题是在我的html页面上,它们仍然都链接到旧文件(application.5e6e7ad87005.css)。
我想清除缓存文件名的缓存(至少,我假设这就是问题所在,如果有人认为这是一个不同的问题,请告诉我),以免丢失我的其他缓存(模板缓存,查询缓存等)
从搜索开始,我似乎只能一次清除所有缓存,而不是单独的缓存。
答案 0 :(得分:1)
这一切都取决于您为模板使用的缓存策略。您是否缓存了每个模板的整体并呈现了页面?
如果是,那么我建议改用template-fragment caching。我们的想法是,您只会缓存每个模板的某些部分,这些部分的渲染成本非常高。您不会缓存那些应该快速呈现的部分,例如指向css文件的链接。
我建议你研究一下django-compressor,它在动态缩小CSS / JS文件以及确保系统地使用这些文件的最新版本方面做得非常棒(如果你不是当然,缓存指向这些文件的链接。
答案 1 :(得分:0)
在这种情况下,我会说heroku config:add ...
是你的朋友。
例如:您可以创建一个bash脚本,为您推送最新的应用程序,并在执行此操作时触发,例如:heroku config:add GIT_LAST_COMMIT=$(git rev-parse HEAD)
。
然后在Python代码中,您可以使用os.environ['GIT_LAST_COMMIT']
来引用该变量。
例如,这是我的Heroku应用程序:http://stormy-badlands-7331.herokuapp.com/
app.py
的代码是:
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World! The latest commit sha is %s' % os.environ['GIT_LAST_COMMIT']
if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
我的deploy.sh
是:
git push heroku master
heroku config:add GIT_LAST_COMMIT=$(git rev-parse HEAD)
请注意,我在推送后更新变量,这样我就可以确保用户不会在新哈希下为旧资产提供服务。
然后您可以使用此os.environ['GIT_LAST_COMMIT']
并将其用作x
var,例如,在加载资源时,例如:
<link rel="stylesheet" type="text/css" href="/assets/css/styles.css?{{ git_last_commit}}" />