2016-12-14 1 views
7

내가 사용한 .js 파일 중 하나에서 변경했는데 플라스크는 메모리 캐시에서 파일의 마지막 버전을 선택하지 않고 변화.플라스크에서 .js 파일의 변화가 보이지 않음

명확히하기 위해 다음 구조를 가지고 있습니다. 그것은 모두 그 어떤 데이터 플라스크 호출 내부 형태를 가지고 foo.html

return render_template foo.html 

foo.html로 시작하고 다음 두 번째 템플릿 bar.html 반환

return render_template bar.html 

이 두 번째 템플릿 일부 .js 파일을 호출의 static에 배치를 폴더에 있지만 코드가 변경되면 업데이트되지 않습니다.

나는 다음 플라스크 파일에 새로운 변경 사항을 것 .js 파일이 foo.html 대신 bar.html에 배치 된 경우 때문에 위의 구조를 언급. 그러나 bar.html에서는 플라스크가이를 완전히 무시합니다.

현재 무슨 일입니까?

브라우저에서 "캐시 사용 중지"를 클릭하고 다시로드하는 것이 효과가있었습니다.

+0

브라우저에서 JS 파일을 표시하도록 변경하려면 서버에 문제가없는 것일 수 있습니다. – cwallenpoole

+0

플라스크에는 문제가 없지만 브라우저는 이전 버전을 캐시에 보관하여 더 빠르게 작동합니다. 일반적으로 정적 .js로 작업하게되므로 아무 문제가 없습니다. 일부 서버는 스크립트에 동적 URL을 사용하여 브라우저에 새 버전을로드하도록합니다. ' "script.js? some_variable = dynamic_value"'. 'dynamic_value'는 버전 번호 또는 파일의 날짜 일 수 있습니다. – furas

+0

하지만 브라우저에서 캐시 된 버전을 사용하지 못하게하려면 어떻게해야합니까? 또한, 왜 두 번째 경우가 정상적으로 작동합니까? – elelias

답변

15

는 궁극적으로이 브라우저/OS에 의존 키 입력을 될 것입니다은 "새로 고침"을 할 브라우저를 강제로 해결 될 수있는 좌절 브라우저 캐시 문제이지만, 일반적으로 작동 :

  • 윈도우 : Ctrl + F5
  • 맥 : Cmd를 + 시프트 + R
  • 리눅스 : Ctrl 키 + 시프트 + R
  • 하나의 의견에 언급 된이 문제를 (피하기 위해 사용할 수있는 다른 파일 이름 트릭이있다

그 OP). 이는 브라우저 작동을 제어 할 수없는 프로덕션 환경에서 특히 중요합니다.

정적이 아닌 플라스크 응답의 경우 브라우저에 캐시 된 응답이 만료 될 때 브라우저에 알려야하는 cache_control.max_age 속성을 설정할 수 있습니다. 예를 들어 당신은 당신이 할 수있는 JSON 데이터를 반환하는 플라스크 XHR 엔드 포인트가있는 경우 :

@app.route('/_get_ajax_data/') 
def get_ajax_data(): 
    data = {"hello": "world"} 
    response = jsonify(data) 
    response.cache_control.max_age = 60 * 60 * 24 # 1 day (in seconds) 
    return response 

당신 일반적으로 특정 리소스 유형에 대한 생산 웹 서버 구성에 기본 값을 설정할 수 있습니다 (예 : CSS/JS/HTML/JSON/등)

1

(이 일반적으로 개발 환경의 경우), 다음이 SEND_FILE_MAX_AGE_DEFAULT configuration value 설정해야 할 수도 있습니다 플라스크에 정적 자산을 제공하는 경우에

기본 캐시 제어 최대 연령 send_static_file() (기본 st atic 파일 핸들러) 및 send_file()datetime.timedelta 또는 초로 지정하십시오. 플라스크 또는 청사진에 각각 get_send_file_max_age() 후크를 사용하여 파일 당 기준으로이 값을 무시합니다. 기본값은 43200 (12 시간)입니다.

이 문제를 해결하는 것은 지금처럼 app.config 사전을 업데이트하는 것처럼 간단 할 수 있습니다 : 당신이 그렇게한다면, 브라우저 플라스크에 의해 제공되는 고정 자산을 캐시하지 않습니다

app = Flask(__name__) 
... 
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 

.

+0

정말 감사합니다. 감사합니다. – elelias

관련 문제