2015-01-12 2 views
22

이것은 성가신 일입니다. 내가 장고 템플릿에 대한 참조 자바 스크립트 파일을 가지고 :Django가 staticfiles를 새로 고치지 않습니다

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

그 js 파일을 변경했습니다. 그런 다음 페이지를 새로 고침하고 변경 사항이 표시되지 않습니다.

파일에서 자바 스크립트를 제거하고 HTML에 넣으면 올바르게 작동하지만 외부 js 파일을 사용하여 수행하려고하면 정상적으로 작동하지 않습니다. 서버를 닫고 runserver를 여러 번 실행하려고 시도했지만 Firefox에서 Chrome으로 변경하려고 시도했습니다. 그것은 전혀 말이되지 않습니다. 이해 좀 도와주세요, HTML 안에 모든 js를 포함하는 것으로 도망 갈 수는 있지만 정상적인 방법으로는 더 이상 할 수 없다는 것을 귀찮게합니다. 합니다 (# $ & %의 # 이상한 일이 내가 찾은)이 오류에 대한

자세한 내용 :

자바 스크립트는이 같은 것입니다 :

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 파일에 대한 참조를 삭제하고 HTML에 스크립트 태그 안에 모든 j를 넣으십시오. 물론 새 문장이 나타납니다. 그런 다음 login.js 파일을 포함하고 html 내의 js를 주석 처리합니다. 그러나 login.js 파일 내의 모든 내용을 삭제하여 빈 파일로 만듭니다.하지만 이전 문장은 여전히 ​​표시됩니다. 따라서 오래된 login.js 파일은 내가 모르는 어딘가에서 현금화되어야합니다. 그런 다음 Chrome을 열고 다시 동일한 문제를 시도합니다.

무엇이 될 수 있습니까? 거기에 정적 파일을 새로 고치려면 장고 강제로 옵션이 무엇입니까? 나는 서버를 다시 시작하는 것으로 충분하다고 생각했다. .. 컴퓨터를 재부팅해야합니까? :/권자.

+2

이 실행 시도가'''파이썬 manage.py의 collectstatic'' : 여기

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

및 결과 출력 '? 그것은 당신이 자바 스크립트의 작업 복사본을 수정하고 그것은 수집 된/오래된 파일을 참조하는 것 같습니다. – cziemba

+7

캐시 지우기가있는 페이지를 새로 고치려면 Ctrl-F5를 시도 했습니까? –

+0

귀하의 의견과 시간에 감사드립니다. 나는 이미 오류를 발견했다. 그것은 정말로 이상한 것이다. 나는 django가 배포시 사용하는 AWS Bucket에 로컬 환경 정적 파일을 가리키는 것을 발견했습니다. 그래서 ... collectstatic을 실행하는 것은 내가 추측하는 해결책의 일부이며, 나머지는 내 정적 파일 설정을 다시 구성하고 어떻게 든 AWS 버킷 문제를 해결합니다. – 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

두 브라우저가 모두 자바 스크립트 파일을 캐싱 한 것 같습니다. Chrome에서는 Ctrl + Shift + Del을 누르고 '캐시 된 이미지 및 파일'만 눌러 캐시를 지울 수 있습니다. 파이어 폭스는 아마도 비슷한 지름길을 가지고있을 것이다.

개발 서버에서 정적 파일 캐싱을 사용하지 않도록 설정하는 방법에 대해서는 this question을 참조하십시오.

+0

정답입니다! – jsmedmar

0

아무 것도 작동하지 않으면 프로젝트에서 파일 이름을 검색하고 예기치 않은 복사본을 찾습니다. 어떤 시점에서 다른 위치 (다른 앱)에 저장했거나 이전 앱에서 새 앱을 분리 한 경우로드 우선 순위가 트릭을 표시 할 수 있습니다.

1

나는 또한이 문제로 몇 시간 동안 고민했습니다. Javascript를 사용하여 임의의 문자열을 주입하려고 시도했지만이 방법은 어리 석고 추한 것처럼 보입니다. 이 문제를 해결할 수있는 한 가지 방법은 맞춤 태그를 도입하는 것입니다.자세한 내용은 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 파일을 변경하면서 페이지를 새로 고친 후 즉시 볼 수 있도록 Firefox 또는 Chrome에서 시크릿 모드를 사용하십시오.

4

브라우저 캐시를 파싱해야합니다. 이 템플릿 태그는 DEBUG=True 일 때 uuid 기반 시간을 출력합니다. 그렇지 않으면 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"/> 
관련 문제