我正在使用Flask开发一个网站,在开发过程中,我使用以下文件运行flask:
#!/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 ###################虽然这不是一个真正的问题(其余的工作如预期),但我只是想知道为什么它会表现成这样?有什么想法吗?
发布于 2014-08-26 19:00:27
Werkzeug重载器会派生一个子进程,这样每次代码更改时它都可以重新启动该进程。当您调用app.run()时,Werkzeug是为Flask提供开发服务器的库。
请参阅restart_with_reloader() function code;使用subprocess.call()再次运行您的脚本。
如果您将use_reloader设置为False,您将看到该行为消失,但随后您也会失去重新加载功能:
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)您也可以在使用flask run命令时禁用重载程序:
FLASK_DEBUG=1 flask run --no-reload如果您想要检测何时处于重新加载子进程中,可以使用werkzeug.serving.is_running_from_reloader function:
from werkzeug.serving import is_running_from_reloader
if is_running_from_reloader():
print(f"################### Restarting @ {datetime.utcnow()} ###################")但是,如果您需要设置模块全局变量,则应该在函数上使用@app.before_first_request decorator,并让该函数设置此类全局变量。
@app.before_first_request
def before_first_request():
print(f"########### Restarted, first request @ {datetime.utcnow()} ############")一定要考虑到,如果您在使用forking或新子流程来处理请求的全规模WSGI服务器中运行此服务,则可能会为每个新子流程调用before_first_request处理程序。
发布于 2017-11-12 22:49:09
如果使用的是现代的flask run命令,则不会使用app.run的任何选项。要完全禁用重载程序,请传递--no-reload
FLASK_DEBUG=1 flask run --no-reload此外,__name__ == '__main__'永远不会是真的,因为应用程序不是直接执行的。除了没有__main__块之外,使用与Martijn's answer相同的想法。
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发布于 2016-12-15 02:47:36
我也遇到了同样的问题,我通过将app.debug设置为False解决了这个问题。将它设置为True会导致我的__name__ == "__main__"被调用两次。
https://stackoverflow.com/questions/25504149
复制相似问题