2015-01-12 6 views
22

यह कष्टप्रद है। मेरे पास एक django टेम्पलेट पर संदर्भित एक जावास्क्रिप्ट फ़ाइल है:Django staticfiles रीफ्रेश नहीं करेगा

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

मैंने उस जेएस फ़ाइल में कुछ बदलाव किए हैं। फिर, मैं पृष्ठ को रीफ्रेश करता हूं और मैं परिवर्तनों को नहीं देख पा रहा हूं।

यदि मैं फ़ाइल से जावास्क्रिप्ट को हटाता हूं और इसे HTML में डालता हूं, तो यह सही तरीके से काम करता है, लेकिन यदि मैं बाहरी जेएस फ़ाइल का उपयोग करके इसे करने का प्रयास करता हूं तो यह नहीं होता है। मैंने सर्वर को बंद करने और कई बार रनरवर चलाने की कोशिश की है, मैंने फ़ायरफ़ॉक्स से क्रोम में बदलने का भी प्रयास किया है। इसके कोई भी मायने नहीं हैं। कृपया मुझे समझने में मदद करें, मैं HTML के अंदर सभी जेएस सहित दूर हो सकता हूं लेकिन यह मुझे परेशान करता है कि मैं इसे सामान्य तरीके से नहीं कर सकता। इस त्रुटि के बारे

अधिक जानकारी (# $% & # अजीब बात मैं मिल गया है):

जावास्क्रिप्ट कुछ इस तरह है:

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 और पुन: प्रारंभ बदल सर्वर, अभी भी एचटीएमएल पुरानी वाक्य दिखाता है। फिर मैंने login.js फ़ाइल के संदर्भ को हटा दिया और HTML में स्क्रिप्ट टैग के अंदर सभी जेएस डाल दिया, ज़ाहिर है, नया वाक्य प्रकट होता है। फिर मैं login.js फ़ाइल शामिल करता हूं, HTML के अंदर जेएस को टिप्पणी करता हूं लेकिन मैं login.js फ़ाइल के अंदर सभी सामग्री को हटा देता हूं, इसे एक खाली फ़ाइल बना देता हूं ... लेकिन पुरानी वाक्य अभी भी दिखाई देती है। इसलिए पुरानी login.js फ़ाइल को कहीं भी कैश किया जाना चाहिए, मुझे नहीं पता। फिर मैं क्रोम खोलता हूं और इसे फिर से कोशिश करता हूं, वही समस्या।

यह क्या हो सकता है? क्या staticfiles रीफ्रेश करने के लिए django को मजबूर करने का कोई विकल्प है? मैंने सोचा कि सर्वर को पुनरारंभ करना पर्याप्त था। .. क्या मुझे अपने कंप्यूटर को रीबूट करना चाहिए? :/ जबरदस्त हंसी।

+2

आपके द्वारा चलाए जा की कोशिश की है '' 'अजगर manage.py collectstatic'':

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

और यहाँ जिसके परिणामस्वरूप उत्पादन होता है '? ऐसा लगता है कि आप जावास्क्रिप्ट की अपनी कार्यशील प्रति को संशोधित कर रहे हैं और यह एकत्रित/पुरानी फ़ाइल का संदर्भ दे रहा है। – cziemba

+7

क्या आपने कैश समाशोधन के साथ पृष्ठ रीफ्रेश करने के लिए Ctrl-F5 को आजमाया था? –

+0

आपकी टिप्पणियों और आपके समय के लिए धन्यवाद। मुझे पहले से ही त्रुटि मिली है, यह वास्तव में एक अजीब था। मैंने पाया कि django एडब्ल्यूएस बाल्टी में स्थानीय पर्यावरण staticfiles इंगित कर रहा है कि मैं तैनाती पर उपयोग करते हैं। तो ... संग्रहित चल रहा समाधान मुझे लगता है कि समाधान का हिस्सा है, बाकी मेरी staticfiles सेटिंग्स को फिर से कॉन्फ़िगर कर रहा है और किसी भी तरह एडब्ल्यूएस बाल्टी समस्या को हल कर रहा है। – alejoss

उत्तर

20
  • स्थिर फ़ाइल साफ़ करना python manage.py collectstatic --noinput --clear। यह पहले से ही सांख्यिकी को साफ़ करेगा।

  • ब्राउज़र संचय साफ़ करें

  • प्रत्येक भार के साथ एक यादृच्छिक स्ट्रिंग के बाद js फ़ाइल में शामिल हैं, उदाहरण के लिए: jquery.js? रैंड = 23,423,423 जोड़ें।

क्या इससे मदद मिली?

+0

पहला विकल्प विकास पर्यावरण पर काम नहीं करेगा। वह आखिरी बिंदु एक अच्छी टिप है हालांकि, मैं अब तक वास्तविक फ़ाइल नाम बदल रहा था, लेकिन यह बहुत बेहतर है :) – guival

+0

आप ? – statBeginner

+0

आप सभी स्थिर फाइलों को क्यों साफ़ करना चाहते हैं? क्या इसका मतलब यह नहीं है कि आपको उन्हें पुनः अपलोड करना होगा? –

1

स्थिर फ़ाइलों को रीफ्रेश करने के लिए आपको python manage.py collectstatic फिर से चलाना चाहिए।

+2

वह 'रनरवर' का उपयोग कर एक देव सर्वर पर है। स्टेटिक फाइलें सीधे उनके मूल स्थान से लोड की जाती हैं, इसलिए 'संग्रहित' कुछ भी नहीं बदलेगी। – knbk

12

ऐसा लगता है जैसे आपके ब्राउज़र में जावास्क्रिप्ट फ़ाइल कैश्ड है। क्रोम में आप Ctrl + Shift + Del दबाकर और 'कैश की गई छवियों और फ़ाइलों' को टिक कर कैश को साफ़ कर सकते हैं। फ़ायरफ़ॉक्स में शायद एक समान शॉर्टकट है।

आप अपने विकास सर्वर पर स्थैतिक फ़ाइलों की कैशिंग को अक्षम करने के लिए युक्तियों पर this question पर एक नज़र डाल सकते हैं।

+0

यह सही जवाब है! – jsmedmar

0

यदि कुछ और काम नहीं करता है, तो परियोजना में फ़ाइल नाम की खोज करें और एक अप्रत्याशित प्रतिलिपि देखें। यदि आप किसी बिंदु पर गलत स्थान (अलग-अलग ऐप) में सहेजे गए हैं, या पुराने से एक नए ऐप को अलग कर दिया है, तो लोड प्राथमिकता आपके लिए चाल चल सकती है।

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

आपका ब्राउज़र छवियों और फ़ाइलों को कैश करेगा (जावास्क्रिप्ट शामिल)। सबसे पहले, बस अपनी कैश की गई छवियों और फ़ाइलों को साफ़ करें। फिर जब आप अपनी .js फ़ाइलों में परिवर्तन कर रहे हों तो क्रोम या निजी ब्राउज़िंग में गुप्त मोड का उपयोग करें ताकि आप पेज को रीफ्रेश करने के तुरंत बाद उन्हें देख सकें

4

आपको ब्राउज़र कैश को बस्ट करने की आवश्यकता है। यह टेम्पलेट टैग DEBUG=True पर एक समय आधारित यूयूआईडी आउटपुट करेगा। अन्यथा यह PROJECT_VERSION पर्यावरण परिवर्तक की तलाश करेगा। यदि यह नहीं मिला है तो यह एक स्थिर संस्करण संख्या आउटपुट करेगा।

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"/> 
संबंधित मुद्दे