5

CSS / Javascriptに遠い将来の期限切れヘッダーを設定しているので、ブラウザーがファイルがキャッシュされた後、ファイルを再度要求することはありません。また、ファイルが変更された場合にクライアントが認識できるように、単純なバージョン管理メカニズムもあります。

基本的に私はテンプレートタグを持っていて、次のようなことをします

<script type="text/javascript" src="{{ MEDIA_URL }}{% versioned "javascript/c/c.js" %}"></script>

になります

<script type="text/javascript" src="http://x.com/media/javascript/c/c.min.js?123456"></script>

テンプレートタグはファイルを開きjavascript/c/c.js.v、バージョン番号を見つけてクエリ文字列に追加します。バージョンは、ファイルが変更されたかどうかをチェックするシェルスクリプト(今のところ手動で実行され、おそらくpre-commitフックが追加されます)によって生成されます(を使用してgit diff)。

これは、次の場合を除いて、すべて正常に機能しています。

画像にも同じ種類のバージョニングを実装したいと思います。ただし、画像は静的ファイル(nginxによって提供される)であるCSSから参照できるため、テンプレートタグはありません。

ファイルのバージョン管理のためのより良いアプローチは何ですか?

または、テンプレートタグを、応答を返す前にすべてのリンクを変更するミドルウェアに置き換えることを考えています。これは、誤って省略される可能性のあるテンプレートタグよりも優れています。しかし、それでもCSSから参照される画像の問題は解決しません。

また、クエリ文字列の一部としてバージョンを指定すると、特定のプロキシがファイルをキャッシュしないという問題が発生する可能性があることを認識しています。たとえば、バージョンをファイル名の一部にすることを検討しますjavascript/c/c.123456.js

注:Djangoを使用してこの問題を解決する方法はないようです(明らかに、Djangoを介してCSSを提供していないため)。しかし、おそらくいくつかのnginxトリックを含む解決策が必要です。

4

5 に答える 5

1

スタイルシートアセット

スタイルシートで参照されるアセットについては、Sass&Compassを使用する方がはるかに優れています。Compassには、スタイルシート内で参照される静的アセットの最後にバージョンクエリパラメーターを自動的に追加するミックスインがあります。バージョン番号は、スタイルシートを再構築するときにのみ変更されます(compass watchローカルで開発する場合は簡単です)。

テンプレートアセット

他のファイルについては、実際には、現在のバージョンを含めることを唯一の目的とするPythonモジュールを書き換えるある種のポストプルフックを使用します。

/var/www/aweso.me/
    ./files/
    ./private-files/
    ./static/
    ./project/
        ./manage.py
        ./fabfile.py
        ./.gitignore
        ./base/
            ./__init__.py
            ./wsgi.py
            ./settings/
                ./__init__.py
                ./modules
                    ./__init__.py
                    ./users.py
                    ./email.py
                    ./beta.py
                    ./redis.py
                    ./haystack.py
                ./version.py
                ./default.py
                ./local.py
                ./live.py

あなたのポストプルフックは作成します:

/var/www/aweso.me/project/base/settings/version.py

これには、最新の(または以前の)git commit hashが含まれます:

__version__ = "0763j34bf"

次に、を単純from .version import __version__ as ApplicationVersionにするsettings.liveと、テンプレートタグを使用from settings import ApplicationVersionして、そのクエリパラメータをキャッシュバスターとして書き込むことができます。

于 2013-05-20T08:20:14.863 に答える
0

この単純なテンプレートタグを使用して、ファイルの変更時間に基づいてバージョン番号を生成しています。

import os
import posixpath
import stat
import urllib

from django import template
from django.conf import settings
from django.contrib.staticfiles import finders

register = template.Library()

@register.simple_tag
def staticfile(path):
    normalized_path = posixpath.normpath(urllib.unquote(path)).lstrip('/')
    absolute_path = finders.find(normalized_path)
    if not absolute_path and getattr(settings, 'STATIC_ROOT', None):
        absolute_path = os.path.join(settings.STATIC_ROOT, path)
    if absolute_path:
        return '%s%s?v=%s' % (settings.STATIC_URL, path, os.stat(absolute_path)[stat.ST_MTIME])
    return path

1.3より前のDjangoには、このタグのさらに単純なバージョンがあります。

@register.simple_tag
def staticfile(path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    url = '%s%s?v=%s' % (settings.MEDIA_URL, path, os.stat(file_path)[stat.ST_MTIME])
    return url

使用法:

<link rel="stylesheet" href="{%  staticfile "css/style.css" %}" type="text/css" media="screen" />
于 2011-05-12T11:20:26.093 に答える
0

pre-commitスクリプトに別の手順を追加して、すべての直接リンクを最小化されたCSS内のバージョン管理されたファイルへのリンクに置き換えます。

それを行うためのより良い方法はないようです。あなたが何かを考えたら、私に知らせてください、そして私はそれを受け入れられた答えとしてマークすることを検討します。

コメントしてくれてありがとう!

于 2011-05-16T06:28:56.130 に答える
-1

これも役立つかもしれません:http://www.fanstatic.org/

于 2011-06-09T06:35:22.553 に答える
-1

簡単な解決策は次のようになると思います。

  1. cssファイルをDjangoテンプレートとして記述します。
  2. djangoコマンドを記述してcss-templatesをレンダリングします(そしてそれらをアクセス可能な場所に保存します)
  3. 展開スクリプトで、このコマンドを呼び出します。
于 2011-06-09T08:55:15.900 に答える