2015-01-12 12 views
22

これは迷惑です。 Djangoはstaticfilesをリフレッシュしません

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

私はそのJSファイルにいくつかの変更を加えた:私は、Djangoのテンプレートを参照するJavaScriptファイルを持っています。その後、私はページをリフレッシュし、私は変更が起こるのを見ることができません。

ファイルからjavascriptを削除してHTMLに挿入すると正しく動作しますが、外部jsファイルを使用してJavaScriptを実行しようとすると正しく動作しません。サーバーを閉じてrunserverを何回か実行しようとしましたが、FirefoxからChromeに変更しようとしました。それはまったく意味がありません。私はHTML内のすべてのjを含めて取り除くことができますが、私はそれがもう正常な方法ではできないことを迷惑にしています。このエラー(私が見つけた#$ &%の#奇妙なもの)について

詳細:

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ファイルへの参照を削除し、すべてのjをHTMLのスクリプトタグの中に入れてください。もちろん、新しい文章が表示されます。次に、login.jsファイルをインクルードし、html内のjsをコメントアウトしますが、login.jsファイル内のすべてのコンテンツを削除して空のファイルにします...しかし、古い文章はまだ表示されます。したがって、古いlogin.jsファイルは、私が知らないどこかでキャッシュする必要があります。それから私はクロームを開き、同じ問題をもう一度試してみる。

何ができますか? djangoにstaticfilesをリフレッシュさせるオプションがありますか?私はサーバーの再起動が十分であると思った。 ..コンピュータを再起動する必要がありますか? :/ 笑。

+2

あなたは 'のpython manage.py collectstatic''' 'ランニング試してみました'?あなたがjavascriptの作業コピーを変更しているように聞こえ、それは収集された/古くなったファイルを参照しています。 – cziemba

+7

Ctrl + F5を押してキャッシュをクリアしたページを更新しましたか? –

+0

あなたのコメントとあなたの時間をありがとう。私はすでにエラーを見つけました、それは確かに奇妙なものでした。私はdjangoがローカル環境の静的ファイルを、私が展開時に使用するAWS Bucketに向けているのを発見しました。ですから... collectstaticを実行することは私が推測する解決策の一部です。残りの部分は私のstaticfiles設定を再構成し、何とかAWS Bucketの問題を解決しています。 – alejoss

答えて

20
  • スタティックファイルpython manage.py collectstatic --noinput --clearをクリアします。これにより、あらかじめ統計が消去されます。

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

  • JSファイルの後にランダムな文字列を追加します。例えばjquery.js、含める?= 23423423ランドを、各負荷に。

それが役に立ちましたか?

+0

最初のオプションは、開発環境では機能しません。最後の点は良いヒントですが、私は今まで実際のファイル名を変更していましたが、それははるかに優れています:) – guival

+0

どのようにランダムなパラメータを? – statBeginner

+0

なぜすべての静的ファイルを消去しますか?それはあなたがそれらを再アップロードする必要があるという意味ですか? –

1

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

+2

彼は 'runserver'を使ってdevサーバにいます。静的ファイルは元の場所から直接ロードされるので、 'collectstatic'は何も変更しません。 – knbk

12

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

ヒントについては、this questionを参照して、開発サーバーで静的ファイルのキャッシュを無効にすることができます。

+0

これは正解です! – jsmedmar

0

他に何も動作しない場合は、プロジェクト内のファイル名を検索し、予期しないコピーを探します。間違った場所(別のアプリ)に保存したり、新しいアプリを古いものから分けたりすると、読み込みの優先度が上がっている可能性があります。

1

私はまた、この問題を何時間も苦労しました。私は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...' %}を使用することができます!

こちらがお役に立てば幸いです。

0

お使いのブラウザは、画像とファイルをキャッシュに格納します(JavaScriptが含まれています)。まず、キャッシュされた画像とファイルを消去します。その後、.jsファイルを変更してページを更新した直後に表示されるように、Firefoxのクロムまたはプライベートブラウズでシークレットモードを使用します。

4

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

{% load cache_bust %} 

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

、ここでは結果の出力です:あなたはこのようなテンプレートで使用することになり

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) 

<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/> 
関連する問題