开发者社区> 问答> 正文

为什么运行烧瓶开发服务器本身要运行两次?

我用弗拉斯克开发一个网站,而在开发过程中,我运行弗拉斯克使用以下文件:

#!/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

展开
收起
kun坤 2019-12-28 13:52:09 407 0
1 条回答
写回答
取消 提交回答
  • 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处理程序可能会被每个新的子进程调用。

    2019-12-28 13:52:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS计算与存储分离架构实践 立即下载