development

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

big-blog 2020. 10. 25. 12:34
반응형

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


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

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

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

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

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


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

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

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

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


내 경험상 템플릿 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


당신이 사용할 수있는

TEMPLATES_AUTO_RELOAD = True

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

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


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')

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

  1. 기능 생성 before_request

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

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


나를 위해 잘 작동합니다.

 from flask import Flask, render_template, request, url_for, redirect
 app = Flask(__name__)
 app.config["TEMPLATES_AUTO_RELOAD"] = True

http://flask.pocoo.org/docs/1.0/config/에서 자세한 내용을 참조하십시오.


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

@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 = {}

(taken from @dikkini's answer)


Using the latest version of Flask on Windows, using the run command and debug set to true; Flask doesn't need to be reset for changes to templates to be brought in to effect. Try Shift+F5 (or Shift plus the reload button) to make sure nothing it being cached.


See http://flask.pocoo.org/docs/1.0/quickstart/ and use FLASK_ENV=development


Updated as of June 2019:

The flask CLI is recommended over app.run() for running a dev server, so if we want to use the CLI then the accepted solution can't be used.

Using the development version of Flask (1.1) as of this writing allows us to set an environment variable FLASK_RUN_EXTRA_FILES which effectively does the same thing as the accepted answer.

See this github issue.

Example usage:

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

in Linux. To specify multiple extra files, separate file paths with colons., e.g.

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

The CLI also supports an --extra-files argument as of Flask 1.1.

참고URL : https://stackoverflow.com/questions/9508667/reload-flask-app-when-template-file-changes

반응형