我用弗拉斯克开发一个网站,而在开发过程中,我运行弗拉斯克使用以下文件:
#!/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 ###################
虽然它不是一个真正的问题(其余的工作如预期),我只是想知道它为什么会这样?什么好主意吗? 问题来源StackOverflow 地址:/questions/59381318/open-new-browser-in-flask-app-if-not-already-running
Werkzeug reloader生成一个子进程,以便在每次代码更改时重新启动该进程。Werkzeug是在调用app.run()时为Flask提供开发服务器的库。 参见restart_with_reloader()函数代码;使用subprocess.call()再次运行脚本。 如果你把use_reloader设为False,你会发现行为消失了,但是你也失去了重载功能:
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
你可以禁用的时候使用烧瓶运行命令也:
FLASK_DEBUG=1 flask run --no-reload
你可以寻找WERKZEUG_RUN_MAIN环境变量,如果你想检测什么时候你在重载子进程:
import os
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
print '################### Restarting @ {} ###################'.format(
datetime.utcnow())
但是,如果需要设置模块全局变量,那么应该使用@app。before_first_request装饰器,并让该函数设置这样的全局变量。它将被调用后,每次重新加载,当第一个请求进来:
@app.before_first_request
def before_first_request():
print '########### Restarted, first request @ {} ############'.format(
datetime.utcnow())
一定要考虑到,如果您在一个完整的WSGI服务器上运行它,它使用分叉或新的子进程来处理请求,那么before_first_request处理程序可能会被每个新的子进程调用。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。