最新消息:20210917 已从crifan.com换到crifan.org

【已解决】Flask中换成工厂模式去初始化app实例后app被初始化两次

Flask crifan 558浏览 0评论
折腾:
【未解决】用蓝图和工厂模式去优化现有Flask项目代码结构
期间,虽然用flask中的g,加上 with app.app_context(),解决了全局变量和循环引入的问题,但是本身Flask的app,被运行了两次:
这会导致内部逻辑有潜在风险:
比如第三方的api接口,获取token,结果获取了两次
-》第二次token是有效,但是覆盖了,冲掉了,导致第一次token就失效了?
-》且其他业务逻辑,有的也不方便多次初始化
所以要去搞清楚:
为何此处的,单线程/单实例?的Flask的app为何被初始化了2次
改为:
create_app放到
if __name__ == “__main__”:
里面:
if __name__ == "__main__":
    print("in flask app: settings=%s" % (settings))
    app = create_app(settings)
    # register_extensions(app)
    log = app.logger
    log.debug("app=%s", app)

    log.debug("log=%s", log)
    log.debug("settings.FLASK_ENV=%s", settings.FLASK_ENV)
    log.debug("settings.DEBUG=%s, settings.MONGODB_HOST=%s, settings.FILE_URL_HOST=%s",
              settings.DEBUG, settings.MONGODB_HOST, settings.FILE_URL_HOST)

    app.run(
        host=app.config["FLASK_HOST"],
        port=app.config["FLASK_PORT"],
        debug=app.config["DEBUG"]
    )
问题依旧:
看到:
Intermediate Usage — Flask-RESTful 0.3.6 documentation
感觉是:
app.py中,并没有:
if __name__ == “__main__”:
并没有app.run?
这里例子中:
flask-example/run.py at master · allisson/flask-example
是另外的,类似的做法:
run.py中才有调用create_app
https://github.com/allisson/flask-example/blob/master/application.py
中本身只有create_app函数,没有调用。
那和我的是一样的啊:
先create_app
再app.run
是对的。
这里:
restapi_example/factory.py at master · flyhigher139/restapi_example
factory才有create_app
restapi_example/app.py at master · flyhigher139/restapi_example
调用create_app,再app.run
flask app instance twice
Flask seems to launch 2 instances of python – Stack Overflow
此处debug是True
但是感觉不是这个原因:
之前就是True,好像也没运行2次
python – apscheduler in Flask executes twice – Stack Overflow
python – How to stop Flask from initialising twice in Debug Mode? – Stack Overflow
还是试试:
app.run(
    host=app.config["FLASK_HOST"],
    port=app.config["FLASK_PORT"],
    debug=app.config["DEBUG"],
    use_reloader=False
)
结果:
就可以了
【总结】
Flask在调试模式:
app.run传入debug为True时
会启动2次,解决办法:
app.run传入:use_reloader=False
变成:
app = create_app(settings)
log = app.logger


if __name__ == "__main__":
    app.run(
        host=app.config["FLASK_HOST"],
        port=app.config["FLASK_PORT"],
        debug=app.config["DEBUG"],
        use_reloader=False
    )
即可。
【后记】
python – Why does running the Flask dev server run itself twice? – Stack Overflow
use_reloader=False
虽然可以工作,但是会丢失:
reload的功能-》
估计之后就会出现,代码改动了,但是flask无法重启的功能了。
-》暂时在debug时,忽略这个功能吧。当代码改动后,手动重启Flask。

转载请注明:在路上 » 【已解决】Flask中换成工厂模式去初始化app实例后app被初始化两次

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.187 seconds, using 23.33MB memory