템플릿 파일 변경시 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를 사용하고 내가 한 일 :
기능 생성
before_request
def before_request(): app.jinja_env.cache = {}
신청서에 등록
app.before_request(before_request)
그게 다야.
나를 위해 잘 작동합니다.
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
'development' 카테고리의 다른 글
화이트 햇 프로그래머를위한 블랙 햇 지식 (0) | 2020.10.25 |
---|---|
Android에서 HTTP 인증을 수행하는 방법은 무엇입니까? (0) | 2020.10.25 |
$ exceptionHandler 구현을 재정의하는 방법 (0) | 2020.10.25 |
.NET에서 오류 및 경고 메시지 상자를 표시하는 방법 / MessageBox를 사용자 지정하는 방법 (0) | 2020.10.25 |
const가 C가 아닌데 C ++에서 내부 연결을 의미하는 이유는 무엇입니까? (0) | 2020.10.24 |