템플릿 파일 변경시 Flask 앱 다시로드


96

기본적으로 기본 제공 서버 ( Flask.run)를 사용하여 Flask 애플리케이션을 실행할 때 Python 파일을 모니터링하고 코드가 변경되면 앱을 자동으로 다시로드합니다.

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

불행히도 이것은 * .py 파일에서만 작동하는 것으로 보이며이 기능을 다른 파일로 확장하는 방법을 찾지 못하는 것 같습니다. 특히 템플릿이 변경 될 때 Flask가 앱을 다시 시작하도록하는 것이 매우 유용합니다 . 몇 번이나 템플릿에서 마크 업을 조작하고 변경 사항이 표시되지 않아 혼란스러워지는 횟수를 잃어 버렸습니다.

그렇다면 Flask가 템플릿 디렉토리에 파일을 모니터링하는 방법이 있습니까? 아니면 프레임 워크의 소스로 들어가야합니까?

편집 : Ubuntu 10.10을 사용하고 있습니다. 다른 플랫폼에서는 실제로 시도하지 않았습니다.


추가 질문 후, 나는 실제로 템플릿이 변경 발견 되는 응용 프로그램 자체를 다시로드하지 않고, 실시간으로 업데이트합니다. 그러나 이것은에 전달되는 템플릿에만 적용되는 것 같습니다 flask.render_template.

하지만 내 앱에는 Jinja 템플릿에서 사용하는 재사용 가능한 매개 변수화 된 구성 요소가 많이 있습니다. 이들은로 구현되고 {% macro %}전용 "모듈"에 상주하며 {% import %}실제 페이지에 포함됩니다. 모두 nice 및 DRY ... 단, 가져온 템플릿은 전혀 통과하지 않기 때문에 수정 여부를 확인하지 않는 render_template것 같습니다.

(이상하게도를 통해 호출 된 템플릿에서는 이런 일이 발생하지 않습니다 {% extends %}. {% include %}은 실제로 사용하지 않기 때문에 전혀 모릅니다.)

정리하자면이 현상의 뿌리는 Jinja와 Flask 또는 Werkzeug 사이에있는 것 같습니다. 나는 그것이 그 프로젝트 중 하나를 위해 버그 추적기로 여행을 보증 할 수 있다고 생각한다. :) 한편, 나는 jd를 받아 들였다 . 그것이 내가 실제로 사용한 해결책이기 때문에 대답입니다. 그리고 그것은 매력처럼 작동합니다.


3
앱이 DEBUG = True로 구성되었는지 확인하고 문서를 참조하십시오 .
Alex Morega

답변:


66

내 경험상 템플릿 render_template()은 호출 될 때마다 디스크에서로드되어야하므로 새로 고침을 위해 응용 프로그램을 다시 시작할 필요조차 없습니다 . 하지만 템플릿이 다르게 사용되었을 수도 있습니다.

템플릿 (또는 다른 파일)이 변경 될 때 애플리케이션을 다시로드하려면 감시 할 파일 이름 모음 인에 extra_files인수를 전달할 수 Flask().run()있습니다. 해당 파일을 변경하면 리 로더가 트리거됩니다.

예:

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

여기를 참조하십시오 : http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple


좋은 물건! 문서 Flask.run에서 Werkzeug 문서로 연결되는 링크를 놓 쳤음을 인정 합니다. 그러나이 특정 옵션은 적어도 Flask 문서에서 언급하기에 충분히 유용합니다.
Xion

라는 오류가 발생하면 No such file or directory다음과 같이 상대 경로를 사용해보십시오.extra_dirs = ['./directory/to/watch',]
Kevin

3
당신도 path그것이 무엇인지 에 대해 혼란스러워한다면 그것은 os.path. 언급 할 가치가 있다고 생각했습니다
bjesus

정적 파일을 변경 한 후 자동으로 다시로드하려면 이를 하십시오 .
simanacci

1
flask run명령 줄에서 실행할 때 추가 파일을 지정하는 방법을 알고 계십니까?
Michael Scheper 2017

147

당신이 사용할 수있는

TEMPLATES_AUTO_RELOAD = True

에서 http://flask.pocoo.org/docs/1.0/config/

템플릿 소스의 수정 사항을 확인하고 자동으로 다시로드할지 여부입니다. 기본적으로 값은 None입니다. 즉, Flask는 디버그 모드에서만 원본 파일을 확인합니다.


11
이 솔루션은 문서로 지원되며 이해하기 쉽고 구현하기 쉽습니다. 받아 들여 져야합니다!
Carolyn Conway

이 답변을 시도했지만 한 번만 작동합니다. 다른 새로 고침 후 작동하지 않습니다
medev21

3
다른 사람들을위한 참고 사항 : 나는했고 app.config['TEMPLATES_AUTO_RELOAD'] = True, 어떤 이유로 디버그 모드 에서처럼 템플릿이 변경되면 서버가 자동으로 다시 시작될 것으로 예상했습니다. 다시 시작되지는 않지만 렌더링하는 템플릿을 업데이트합니다.
cs01

3
이것이 0.12에서 작동하지 않는 이유는 무엇입니까? 또는 이것이 제대로 설정되지 못하게하는 다른 설정?
user805981

3
@Federer 예전처럼 작동하지 않는 것 같습니다 ... 전에는 템플릿 디렉토리와 하위 디렉토리의 변경 사항을 감지했을 것이고 서버를 다시로드 할 것입니다 .... 이것은 0.12에서 새로운 것입니까? 변경?
user805981

55

jinja템플릿 으로 작업 할 때 몇 가지 매개 변수를 설정해야합니다. python3의 경우 다음 코드로 해결했습니다.

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

1
당신은 내 정신을 구했습니다. 감사합니다.
Nostalg.io

나는 또한 그 문제로 어려움을 겪고 있었다. 내가 도울 수 기뻐요)
silgon

이것은 플라스크 1.0.2에서 나를 위해 일하고 있지만 호스트 인수가 없습니다.
Enrico Borba

예 @EnricoBorba, 아마도 필요하지 않을 것입니다. Docker를 사용하여 로컬에서 디버그하고 때로는 다른 컨테이너에서 응용 프로그램에 액세스해야하기 때문에 일반적으로 사용합니다. 일부 참조
silgon

@silgon 네 이해합니다. 플라스크 버전 1.0.2 새로 설치에 일을 내가 주로 막 명확하게 의견을 추가 한
엔리코 BORBA을


10

실제로 나를 위해 TEMPLATES_AUTO_RELOAD = True작동하지 않습니다 (0.12 버전). 나는 jinja2를 사용하고 내가 한 일 :

  1. 기능 생성 before_request

    def before_request():
        app.jinja_env.cache = {}
    
  2. 신청서에 등록

    app.before_request(before_request)
    
  3. 그게 다야.


3
개럿,이 옵션 없이는 테스트하지 않았습니다.
dikkini

3 단계는 실제로 필요하지 않으며 저에게 매우 잘 작동했습니다.
Ricardo Ribeiro

4

나를 위해 일한 것은 이것을 추가하는 것입니다.

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.host_url or '0.0.0.0' in request.host_url:
        app.jinja_env.cache = {}

( @dikkini의 답변에서 가져옴 )


2

Windows에서 최신 버전의 Flask를 사용하여 실행 명령 및 디버그를 true로 설정합니다. 템플릿 변경 사항을 적용하기 위해 Flask를 재설정 할 필요가 없습니다. Shift + F5 (또는 Shift + 다시로드 버튼)를 사용하여 캐시 된 항목이 없는지 확인하십시오.



1

2019 년 6 월 업데이트 :

플라스크 CLI 우리가 다음 허용 솔루션을 사용할 수 없습니다 CLI를 사용하려면 그렇다면, dev에 서버를 실행하기위한 app.run () 이상을 권장합니다.

이 글을 쓰는 현재 Flask (1.1)의 개발 버전을 사용하면 허용 된 답변과 동일한 작업을 효과적으로 수행하는 환경 변수 FLASK_RUN_EXTRA_FILES를 설정할 수 있습니다.

참조 이 github의 문제를 .

사용 예 :

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

Linux에서. 여러 개의 추가 파일을 지정하려면 콜론으로 파일 경로를 구분하십시오. , 예 :

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

CLI는 --extra-filesFlask 1.1 의 인수 도 지원합니다 .


사소한 업데이트. 'flask CLI'에 대한 링크는 현재 버전으로 업데이트해야합니다. flask.palletsprojects.com/en/1.1.x/cli 그렇지 않으면 감사합니다 :)
CodingMatters

1

템플릿은 자동으로 다시로드됩니다 ctrl+f5. 웹 페이지를 새로 고치지 않는 이유 는 웹 브라우저가 일반적으로 캐시를 저장하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.