折腾:
【未解决】用蓝图和工厂模式去优化现有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"] )
问题依旧:
看到:
感觉是:
app.py中,并没有:
if __name__ == “__main__”:
并没有app.run?
这里例子中:
是另外的,类似的做法:
run.py中才有调用create_app
而
中本身只有create_app函数,没有调用。
那和我的是一样的啊:
先create_app
再app.run
是对的。
这里:
factory才有create_app
调用create_app,再app.run
flask app instance twice
此处debug是True
但是感觉不是这个原因:
之前就是True,好像也没运行2次
还是试试:
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 )
即可。
【后记】
use_reloader=False
虽然可以工作,但是会丢失:
reload的功能-》
估计之后就会出现,代码改动了,但是flask无法重启的功能了。
-》暂时在debug时,忽略这个功能吧。当代码改动后,手动重启Flask。