2

我对 Heroku 上托管的 django 1.4 站点有疑问。我们将 Memcache 用于各种缓存,例如模板和静态资产缓存。[更新:根据 django 文档,django 似乎没有将 memcache 用于模板加载器缓存]

有时当我将网站推送到heroku时,静态css文件的链接在缓存清除之前不会更新(手动或我猜测它何时超时,因为如果我离开它似乎会在几分钟后自行修复独自的)。

所以这是不可接受的,因为我的 HTML 是新版本,而我的 css 将是旧版本,直到缓存更新并且 url 更改为新的 css 文件。

例子:

该站点具有 html(我们将其称为 v1)并链接到一个 css 文件,例如:application.5e6e7ad87005.css

我对 application.css 文件进行更改并推送站点。这会导致静态文件生成一个新的 css 文件名,比如说:application.5e6e7ad87006.css

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

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

通过搜索,我似乎只能一次清除所有缓存,而不是单个缓存。

4

2 回答 2

1

这完全取决于您为模板使用的缓存策略。您是否缓存了每个模板和渲染页面的全部内容?

如果是这样,那么我建议改用模板片段缓存。这个想法是你只会缓存每个模板的某些渲染成本很高的部分。您不会缓存应该快速渲染的部分,例如指向您的 css 文件的链接。

我建议您还研究一下django-compressor,它在动态缩小 CSS/JS 文件和确保系统地使用这些文件的最新版本方面做得非常出色(前提是您没有缓存指向这些文件的链接)文件,当然)。

于 2013-01-09T07:43:05.637 回答
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']其用作xvar,例如,在加载资产时,例如:

<link rel="stylesheet" type="text/css" href="/assets/css/styles.css?{{ git_last_commit}}" />
于 2013-01-09T09:30:44.653 回答