关于应用程序可调用对象、WSGI 服务器和 Flask 循环导入的问题
我(可能)很困惑。我想从 app-factories 安全地创建 Flask / WSGI 应用程序,并且仍然能够轻松地在 WSGI 服务器中使用它们。
tl;博士
我可以安全地避免在导入init时创建应用程序(如推荐的那样),而是稍后创建它(即使用工厂方法)
如何使该应用程序与 WSGI 服务器一起工作?尤其是当我传入配置和其他设置而不是从 ENV 中提取它们时
例如::
def make_app(configdict, appname):
app = Flask(appname)
app.config.update(configdict)
init_db(configdict)
set_app_in_global_namespace(app)
#importing now will allow from pkg import app
from mypackage import views
return app
我想使用上面的“工厂”,因为我想轻松地控制配置以进行测试等。
然后我大概想创建一个 wsgi.py 模块,将应用程序提供给 WSGI 服务器。
所以最终事情看起来有点像这样
初始化.py::
app = None
def make_app(configdict, appname):
flaskapp = Flask(appname)
flaskapp.config.update(configdict)
init_db(configdict)
global app
app = flaskapp
#importing now will allow from pkg import app
from mypackage import views
return flaskapp
wsgi.py::
from mypackage import app
app = make_app(configfromsomewhere, "myname")
uWSGI::
uwsgi --module=mypackage.wsgi:app
但是 wsgi.py 仍然不是我可以调用的东西,例如 wsgi.py --settings=x --host=10.0.0.1 所以我真的不知道如何将配置传递给 .
我问是因为虽然这看起来......好吧......它也有点乱。
当一切都在 ENV 中时,生活会更轻松。
不仅如此,而且:
那么使用 app-factory 有什么不安全的地方
给出的建议here <http://flask.pocoo.org/docs/patterns/packages>
是::
1. the Flask application object creation has to be in the
__init__.py file. That way each module can import it safely and
the __name__ variable will resolve to the correct package.
2. all the view functions (the ones with a route() decorator on
top) have to be imported in the __init__.py file. Not the object
itself, but the module it is in. Import the view module after
the application object is created.
回复:2. 显然,路由装饰器期望实例化应用程序具有某些能力,没有它们就无法运行。没关系。
回复:1.,好的,我们需要正确的名称。但是什么是不安全的?为什么?如果未初始化,导入和使用应用程序是否不安全?好吧,它会坏掉,但那不是不安全的。它是大肆吹嘘的线程本地吗?可能。但是,如果我不顾一切地从随机模块中提取应用程序实例,我应该会遇到麻烦。
含义——我们不从视图以外的任何地方引用应用程序对象——本质上我们保持我们的模块化良好和紧凑,并传递字典、错误对象甚至 WebObs。
http://flask.pocoo.org/docs/patterns/appdispatch http://flask.pocoo.org/docs/deploying/#deployment http://flask.pocoo.org/docs/patterns/packages/#larger-应用程序 http://flask.pocoo.org/docs/becomingbig