web-dev-qa-db-ja.com

Djangoは静的ファイルを更新しません

これは面倒です。 Django=テンプレートで参照されるjavascriptファイルがあります。

 <script src="{% static 'js/login.js' %} "></script>

そのjsファイルにいくつかの変更を加えました。次に、ページを更新しますが、変更が発生するのがわかりません。

Javascriptをファイルから削除してHTMLに入れると、正しく動作しますが、外部jsファイルを使用して実行しようとすると、動作しません。サーバーを閉じてrunserverを数回実行しようとしました。また、FirefoxからChromeに変更しようとしました。まったく意味がありません。私が理解するのを助けてください、私はHTMLの中にすべてのjsを含めることで逃げることができますが、私はもうそれを通常の方法で行うことができないことを気にします。

このエラーの詳細(#$&%#で見つけた最も奇妙なもの):

Javascriptは次のようなものです。

old_sentence = "Dig that hole, forget the Sun"  // this is what I want to change
$("#jqselector").text(old_sentence)

new_sentence = "Run, rabbit, run"  // this is the new sentence, it just won't show up.

そのため、jsを変更してサーバーを再起動しましたが、まだHTMLには古い文が表示されています。次に、login.jsファイルへの参照を削除し、すべてのjsをHTMLのスクリプトタグ内に配置します。もちろん、新しい文が表示されます。次に、login.jsファイルをインクルードし、html内のjsをコメントアウトしますが、login.jsファイル内のすべてのコンテンツを削除し、空のファイルにします...しかし、古い文はまだ表示されます。したがって、古いlogin.jsファイルは、私が知らないどこかにキャッシュする必要があります。次に、Chromeを開いて、同じ問題をすべてもう一度試します。

それは何でしょうか? Django= staticfilesを更新するオプションはありますか?サーバーを再起動するだけで十分だと思いました。.コンピューターを再起動する必要がありますか?:/ lol。

39
  • 静的ファイルのクリアpython manage.py collectstatic --noinput --clear。これにより、事前に統計情報がクリアされます。

  • ブラウザのキャッシュをクリアする

  • Jsファイルインクルードの後に​​ランダムな文字列を追加します(例:jquery.js?rand = 23423423、ロードごと)。

役に立ちましたか?

48
Danial Tz

両方のブラウザにjavascriptファイルがキャッシュされているようです。 Chromeでは、Ctrl + Shift + Delを押して、 'キャッシュされた画像とファイル'にチェックを入れるだけでキャッシュをクリアできます。同様のショートカットがあります。

開発サーバーで静的ファイルのキャッシュを完全に無効にするためのヒントについては、 この質問 をご覧ください。

22
knbk

ブラウザのキャッシュを無効にする必要があります。このテンプレートタグは、DEBUG=Trueのときに時間ベースのuuidを出力します。それ以外の場合は、PROJECT_VERSION環境変数を探します。それが見つからない場合、静的バージョン番号が出力されます。

import os
import uuid
from Django import template                                                                                                              
from Django.conf import settings                                                                                                         

register = template.Library()                                                                                                            

@register.simple_tag(name='cache_bust')                                                                                                  
def cache_bust():                                                                                                                        

    if settings.DEBUG:                                                                                                                   
        version = uuid.uuid1()                                                                                                           
    else:                                                                                                                                
        version = os.environ.get('PROJECT_VERSION')                                                                                       
        if version is None:                                                                                                              
            version = '1'                                                                                                                

    return '__v__={version}'.format(version=version)

次のようなテンプレートで使用します。

{% load cache_bust %}

<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>

結果の出力は次のとおりです。

<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
15
Derrick Petzold

複雑なソリューションを使用する代わりに、テンプレートのインクルードに追加のパラメーターを追加できます。

静的インクルードの場合:

<script src="{% static 'js/polls/polls.js' %}?version=1"></script>

直接インクルードの場合:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />  

コード内の?version=1に注意してください。 css/jsファイルを変更するたびに、テンプレートでこのバージョンを変更します。これにより、ブラウザーはファイルのリロードを強制されます。

また、何らかの不明な理由でキャッシュをまったく回避したい場合は、バージョンの代わりに現在のタイムスタンプを使用できます。

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
2
The Godfather

私もこの問題に何時間も苦労しています。 Javascriptを使用してランダムな文字列を挿入しようとしましたが、この方法は愚かで見苦しいようです。この問題を処理する1つの方法は、カスタムタグを導入することです。詳細については、こちらをご覧ください document

具体的には、作成したアプリにtemplatetagsというパッケージを作成する必要があります(または、必要に応じて新しいアプリを作成します)。そして、このパッケージにファイルを作成し、次のように記述します。

from Django import template
from Django.utils.crypto import get_random_string
from Django.templatetags import static

register = template.Library()


class StaticExtraNode(static.StaticNode):

    def render(self, context):
        return super().render(context) + '?v=' + get_random_string(32)


@register.tag('static_no_cache')
def do_static_extra(parser, token):
    return StaticExtraNode.handle_token(parser, token)


def static_extra(path):
    return StaticExtraNode.handle_simple(path)

タグ{% static_no_cache '.../.../path...' %}を使用して、ランダムな引数でパスを作成できます!

これが役立つことを願っています!

2
Scott Chang

静的ファイルを更新するには、python manage.py collectstaticを再度実行する必要があります。

1
catavaran

静的ファイルを再収集した後の私にとっては、変更だけが反映されました。

$ python manage.py collectstatic --noinput --clear

サーバーを実行し、動作することを望みます。

$ python manage.py runserver
0
Chandan Sharma

1つの解決策は、設定を次のように変更することです。

STATICFILES_STORAGE = 'Django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

これにより、ファイル名にコンテンツハッシュを含む静的ファイルのコピーが作成されます(collectstaticの実行時)。このように、コンテンツが変更されると、ファイル名が変更され、古いキャッシュは使用されません。これの唯一の問題は、DEBUG = Trueモードなので、ハードリロードを行うにはShift-Reloadを行う必要があります。

詳細については、 ManifestStaticFilesStorageのドキュメント を参照してください。

EDIT:静的ファイルがdevにキャッシュされないようにするための解決策 を見つけ、別の質問に投稿しました。

0
Tim Tisdall

何も機能しない場合は、プロジェクトでファイル名を検索し、予期しないコピーを探します。ある時点で間違った場所(別のアプリ)に保存した場合、または古いアプリから新しいアプリを切り離した場合、ロードの優先順位があなたを裏切る可能性があります。

0
pragmar