2013-01-09 50 views
2

我在Heroku上托管的django 1.4网站出现问题。我们使用Memcache进行各种缓存,如模板和静态资产缓存。 [更新:根据django文档,Django似乎并没有使用memcache模板加载器缓存]如何重置静态文件名的django缓存?

有时,当我推动网站到heroku时,静态css文件的链接不会更新,直到缓存清除手动或我猜是什么时候它超时,因为它似乎在几分钟后修复自己,如果我离开它)。

所以这是不可接受的,因为我的HTML是新版本,我的CSS将是旧版本,直到缓存更新和URL更改为新的CSS文件。

例子:

该网站有HTML(我们称之为V1),并链接到一个css文件,如: application.5e6e7ad87005.css

我进行更改application.css文件并推动网站。这将导致由staticfiles东西可以产生一个新的CSS文件名,可以说: application.5e6e7ad87006.css

的问题是,我的html页面上,他们仍然都链接到旧文件(application.5e6e7ad87005。 CSS)。

我想清除只有缓存文件名的缓存(至少,我假设这是问题所在,如果有人认为这是一个不同的问题,请让我知道),以免丢失我的其他缓存(模板缓存,查询缓存等)

从搜索中,似乎我只能立即清除所有缓存,而不是单个缓存。

回答

1

这一切都取决于您为模板使用的缓存策略。你缓存每个模板和呈现页面的整体吗?

如果是这样,那么我建议使用template-fragment caching来代替。这个想法是,你只会缓存每个模板的某些部分,渲染的代价非常昂贵。你不会缓存想要渲染的部分,比如指向你的css文件的链接。

我建议你也看看django-compressor,这无论是在涅槃的飞行CSS/JS文件,并在确保提供系统就会使用这些文件的最新版本(你不缓存链接做的真棒工作对那些文件,当然)。

+0

我启用默认模板缓存,但我们并没有明确的缓存什么: '( ( 'django.template.loaders.cached.Loader',( 'hamlpy.template.loaders.HamlPyFilesystemLoader', 'hamlpy.template.loaders.HamlPyAppDirectoriesLoader', “django.template.loaders.filesystem .Loader', 'dja ngo.template.loaders.app_directories.Loader”, ),), )' – Geoff

+0

我想这意味着我们整个模板缓存无论默认设置是(我认为我们有超时设置为‘500’,这是heroku插件如何设置它的。 – Geoff

+0

将做模板片段缓存是'django.template.loaders.cached.Loader'模板加载器的更好的替代品,还是不相关? – Geoff

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变种,例如加载你的资产,例如当:

<link rel="stylesheet" type="text/css" href="/assets/css/styles.css?{{ git_last_commit}}" /> 
+0

嗯,以及我不喜欢这个方法的原因有两个:1)使用查询字符串对于某些代理服务器来说效果不好,最好使用实际的文件名。 2)每次我推送时,这会改变每个文件,而不仅仅是改变的文件。 Django的静态文件应用程序在文件更改时已经生成了新的文件名。 我遇到的问题仅仅是当我推送时更新链接到文件的html的更新 - 看起来我的模板缓存过于激进。 – Geoff