programing

Flask dev 서버를 실행하는 이유는 무엇입니까?

iphone6s 2023. 7. 6. 21:58
반응형

Flask dev 서버를 실행하는 이유는 무엇입니까?

저는 웹사이트 개발을 위해 플라스크를 사용하고 있으며 개발 중에는 다음 파일을 사용하여 플라스크를 실행하고 있습니다.

#!/usr/bin/env python
from datetime import datetime
from app import app
import config

if __name__ == '__main__':
    print('################### Restarting @', datetime.utcnow(), '###################')
    app.run(port=4004, debug=config.DEBUG, host='0.0.0.0')

서버를 시작할 때 또는 파일이 업데이트되었기 때문에 자동으로 재시작할 때 항상 인쇄 줄이 두 번 표시됩니다.

################### Restarting @ 2014-08-26 10:51:49.167062 ###################
################### Restarting @ 2014-08-26 10:51:49.607096 ###################

실제로는 문제가 되지 않지만(나머지는 예상대로 작동), 왜 이렇게 행동하는지 궁금할 뿐입니다.아이디어 있어요?

Werkzeug reloader는 코드가 변경될 때마다 해당 프로세스를 다시 시작할 수 있도록 하위 프로세스를 생성합니다.는 Werkzeug라고 입니다.app.run().

함수 코드를 참조하십시오. 스크립트는 다음을 사용하여 다시 실행됩니다.subprocess.call().

설정하는 경우use_reloaderFalse동작이 사라지는 것을 볼 수 있지만 다시 로드 기능도 마찬가지입니다.

app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)

를 사용할 때 재로더를 사용하지 않도록 설정할 수 있습니다.flask run명령도:

FLASK_DEBUG=1 flask run --no-reload

하위 프로세스를 다시 로드할 때 이 기능을 사용할 수 있습니다.

from werkzeug.serving import is_running_from_reloader

if is_running_from_reloader():
    print(f"################### Restarting @ {datetime.utcnow()} ###################")

그러나 모듈 전역을 설정해야 하는 경우 대신 함수에 장식자를 사용하고 해당 함수가 전역을 설정하도록 해야 합니다.첫 번째 요청이 들어오면 다시 로드할 때마다 한 번만 호출됩니다.

@app.before_first_request
def before_first_request():
    print(f"########### Restarted, first request @ {datetime.utcnow()} ############")

요청을 새로운 하는 풀 WSGI 서버에서 실행하는 경우 해당 WSGI 서버에서 실행하는 하십시오.before_first_request 새 하위 프로세스에 대해 처리기를 호출할 수 있습니다.

이 현대적인 경우을사는용을 한다면,flask run " ", " " 이 없습니다.app.run사용됩니다.재로더를 완전히 비활성화하려면 다음을 통과합니다.--no-reload:

FLASK_DEBUG=1 flask run --no-reload

또한.__name__ == '__main__'앱이 직접 실행되지 않기 때문에 절대 사실이 아닐 것입니다.마르틴의 대답에서 동일한 아이디어를 사용합니다. 단, 다음과 같은 아이디어가 없는 경우는 제외합니다.__main__블록으로 막다

if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':
    # do something only once, before the reloader

if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
    # do something each reload

나도 같은 문제가 있었고, 설정으로 해결했습니다.app.debugFalse으로 설정:True나의 원인이 되었습니다.__name__ == "__main__"두 번 불림

플라스크 0.11부터는 다음과 같이 앱을 실행하는 것이 좋습니다.flask runpython application.py후자를 사용하면 코드를 두 번 실행할 수 있습니다.

여기에 명시된 바와 같이:

플라스크 0.11 이후부터는 플라스크 방법이 권장됩니다.그 이유는 재로드 메커니즘이 작동하는 방식으로 인해 몇 가지 이상한 부작용(특정 코드를 두 번 실행하는 것과 같은)이 있기 때문입니다.

플러그인 - python-dotenv를 사용하고 있으며 구성 파일 - .flaskenv:

FLASK_RUN_RELOAD=거짓

그러면 플라스크가 두 번 흐르는 것을 피할 수 있습니다.

저도 같은 문제가 있었습니다.메인을 수정하고 use_reloader=False를 삽입하여 해결했습니다.이 문제에 대한 해결 방법을 찾고 있는 사람이 있으면 아래 코드를 사용하면 시작할 수 있지만, 자동으로 감지되는 코드 변경 기능을 제거하고 응용 프로그램을 다시 시작할 수 없습니다.코드에서 편집할 때마다 응용 프로그램을 수동으로 중지하고 다시 시작해야 합니다.

if __name__ == '__main__':
    app.run(debug=True, use_reloader=False)

플라스크 앱이 자체적으로 두 번 실행되는 가능한 이유 중 하나는 다음과 같은 구성 때문입니다.WEB_CONCURRENCY헤로쿠를 배경으로.하나로 설정하려면 콘솔에 기록할 수 있습니다.heroku config:set WEB_CONCURRENCY=1

언급URL : https://stackoverflow.com/questions/25504149/why-does-running-the-flask-dev-server-run-itself-twice

반응형