코드 변경시 Python Flask 앱 자동 재로드


205

파이썬으로 괜찮은 웹 앱을 개발하는 방법을 조사 중입니다. 고차원 적 구조를 원하지 않기 때문에 저의 선택은 가벼운 Flask 프레임 워크 에 떨어졌습니다 . 이것이 올바른 선택인지 시간이 알려줄 것입니다.

이제 mod_wsgi를 사용하여 Apache 서버를 설정했으며 테스트 사이트가 제대로 실행되고 있습니다. 그러나 필자가 작성한 py 또는 템플릿 파일의 변경 사항이 있으면 사이트를 자동으로 다시로드하여 개발 루틴의 속도를 높이고 싶습니다. 사이트의 .wsgi 파일을 변경하면 다시로드가 발생하지만 (아파치 구성 파일에 WSGIScriptReloading On이 없어도) 수동으로 생성해야합니다 (예 : 추가 줄 바꿈 삽입, 저장). 앱의 일부 py 파일을 편집 할 때 다시로드하는 방법이 있습니까? 또는 .wsgi 파일을 새로 고치는 IDE를 사용해야합니까?

답변:


233

현재 권장되는 방법은 flask명령 행 유틸리티를 사용하는 것입니다.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

예:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

또는 하나의 명령으로 :

$ FLASK_APP=main.py FLASK_ENV=development flask run

기본 ( 5000) 추가 --port옵션 과 다른 포트를 원할 경우

예:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

더 많은 옵션을 사용할 수 있습니다 :

$ flask run --help

3
또는 python3.5의 pyvenv flask run도 작동 pip install flask합니다. 플라스크 실행 파일도 venv/bin/폴더에 설치되어 있기 때문 입니다.
TonyTony

개발 목적으로 Docker로 변환 할 수있는 간단한 솔루션입니다. 여기서도 동일한 솔루션을 볼 수 있습니다 .

1
정상적으로 작동하지만 NTFS 파티션의 코드가있는 우분투에서는 작동하지 않는 것 같습니다. 코드에는 문제가 없지만 플라스크가 해당 설정의 변경 사항을 인식하지 못하는 것 같습니다.
citynorman

211

테스트 / 개발 환경에 대해 이야기하는 경우 디버그 옵션을 사용하십시오. 코드가 변경되면 플라스크 앱을 자동으로 다시로드합니다.

app.run(debug=True)

또는 껍질에서 :

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode


6
기본 제공 개발 서버를 통해 사이트를 실행할 때만 작동합니다. 그러나 Apache에서 wsgi를 통해 실행할 때는 아닙니다. 그리고 나는 아파치에서 실제로 실행해야한다고 주장하지 않으므로 제안하는 것이 올바른 방법 일 것입니다.
Passiday

4
옳은. 개발 환경에서 내장 서버는 실제로 잘 작동하므로 앱을 다시로드하기 위해 휠을 다시 만들 필요가 없습니다. 개발을 위해 내장 서버를 사용하는 것이 좋습니다. 목적. 어쨌든, 코드를 변경할 때마다 앱을 자동으로 다시로드하고 싶지는 않습니다.
codegeek

44

테스트 / 개발 환경에서

werkzeug 디버거에는 이미 다음 중 하나를 수행하여 활성화 할 수있는 '자동 재로드'기능이 있습니다.

app.run(debug=True)

또는

app.debug = True

필요한 경우 별도의 구성 파일을 사용하여 모든 설정을 관리 할 수도 있습니다. 예를 들어 'DEBUG = True'옵션과 함께 'settings.py'를 사용합니다. 이 파일을 가져 오는 것도 쉽습니다.

app.config.from_object('application.settings')

그러나 이것은 프로덕션 환경에 적합하지 않습니다.

생산 환경

개인적으로 몇 가지 성능상의 이유로 구성 옵션뿐만 아니라 Apache + mod_wsgi 대신 Nginx + uWSGI를 선택했습니다. 터치 리로드 옵션은 uWSGI 응용 프로그램이 새로 배치 된 플라스크에 응용 프로그램을 다시하게됩니다 파일 / 폴더를 지정할 수 있습니다.

예를 들어, 업데이트 스크립트는 최신 변경 사항을 가져오고 'reload_me.txt'파일을 터치합니다. uWSGI ini 스크립트 (이것은 Supervisord에 의해 유지됨)는이 줄을 어딘가에 가지고 있습니다 :

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

이게 도움이 되길 바란다!


1
좋은 팁 주셔서 감사합니다. 나는 그것을 조금 단순화했다. 실행될 때 자신을 건 드리는 bash 스크립트를 작성하십시오. 따라서 다시로드 할 때만 시작하면됩니다. 내 솔루션 : # touch_me_and_reload.sh touch $ 0
Jabba

@ 완 터치 리로드 라인은 어디에 있어야합니까? [program : uwsig] 섹션 또는 [supervisord] 섹션?
user805981

@ user805981- 별도의 uwsgi 구성 .ini파일이 아닙니다 . "touch-reload"에 대한 문서를 읽으면 감독자 구성이 아니라 uWSGI에 있습니다.
Ewan

고마워 app.run(debug=True)실패하지만 환경 변수 설정이 작동합니다.
Ari

23

uwsgi를 사용하여 실행중인 경우 python auto reload 옵션을 살펴보십시오.

uwsgi --py-autoreload 1

uwsgi-dev-example.ini 예 :

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

그런 다음 다음을 실행하십시오.

uwsgi --ini uwsgi-dev-example.ini

참고 :이 예제는 디버거도 활성화합니다.

나는이 경로를 nginx 설정으로 가능한 한 가깝게 생산을 모방했습니다. nginx 뒤의 웹 서버에 내장 된 플라스크 앱을 실행하면 게이트웨이 오류가 발생합니다.


16

Flask 1.0 이상에 대한 몇 가지 업데이트

핫 리로딩에 대한 기본 접근 방식은 다음과 같습니다.

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • 사용 FLASK_ENV=development하지 않아야합니다 ( FLASK_DEBUG=1)
  • 안전 점검으로, 당신은 flask run --debugger그것이 켜져 있는지 확인하기 위해 실행할 수 있습니다
  • 플라스크 CLI는 자동으로 같은 것을 읽 FLASK_APP하고 FLASK_ENV당신이있는 경우 .env프로젝트 루트에서 파일파이썬 - dotenv가 설치되어

export FLASK_ENV=development나를 위해 일했다. app.run(debug=True)작동하지 않는 것 같습니다.
alex

3

다른 생각이 있습니다.

먼저:

pip install python-dotenv

python-dotenv프로젝트 환경에 대한 로컬 환경 설정을 읽는 모듈을 설치하십시오 .

둘째:

.flaskenv프로젝트 디렉토리에 파일을 추가 하십시오. 다음 코드를 추가하십시오.

FLASK_ENV=development

끝났다!

Flask 프로젝트에 대한이 구성을 사용하면 실행 flask run하면 터미널에 다음 출력이 표시됩니다.

여기에 이미지 설명을 입력하십시오

파일을 편집 할 때 변경 사항을 저장하십시오. 자동 새로 고침 기능이 제공됩니다.

여기에 이미지 설명을 입력하십시오

자세한 설명 :

물론 export FLASK_ENV=development필요할 때마다 수동으로 맞출 수 있습니다 . 그러나 실제 작업 환경을 처리하기 위해 다른 구성 파일을 사용하는 것이 더 나은 솔루션 인 것 같습니다. 따라서이 방법을 사용하는 것이 좋습니다.


완전한! 또한 FLASK_APP변수를 .flaskenv파일 에 포함시키는 것을 잊지 마십시오 .
Cequiel

2

플라스크 애플리케이션은 디버그 모드에서 선택적으로 실행될 수 있습니다. 이 모드에서는 리 로더디버거 라는 개발 서버의 매우 편리한 두 개의 모듈이 기본적으로 사용됩니다. 리 로더가 활성화되면 Flask는 프로젝트의 모든 소스 코드 파일을 감시하고 파일이 수정되면 서버를 자동으로 다시 시작합니다.

기본적으로 디버그 모드는 비활성화되어 있습니다. 이를 활성화하려면 FLASK_DEBUG=1플라스크를 호출하기 전에 환경 변수를 설정하십시오 run.

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

소스 파일을 수정하고 저장할 때마다 서버가 자동으로 다시 시작되고 변경 사항을 선택하기 때문에 리 로더를 사용 하여 실행중인 서버를 개발하는 동안 매우 유용합니다.



0

$ env : Flask_ENV = "MyAPP.py"

$ env : Flask_ENV = "개발"

플라스크 실행

작동해야합니다


아마도 툴셋, 호스트 운영 체제 등과 같은이 아이디어에 약간의 컨텍스트를 추가하는 것이 유용 할 것입니다.
Manfred

0

터미널에서 u는 간단히 말할 수 있습니다.

expoort FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

또는 ur 파일로

if __name__ == "__main__":
    app.run(debug=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.