关于应用可调用性、WSGI服务器和Flask循环导入的问题
我可能有些困惑。我希望能够安全地从应用工厂创建Flask/WSGI应用程序,并且仍然能够轻松地在WSGI服务器中使用它们。
简述:
我可以安全地避免在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
我想使用上面的“factory”,因为我希望轻松控制测试等配置。
然后,我可能希望创建一个wsgi.py模块,将应用程序提供给WSGI服务器。
最终,事情看起来有点像这样:
init.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中时,生活会更容易。
而且不仅如此:
那么使用应用工厂有哪些不安全的地方
建议在这里给出: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-applications http://flask.pocoo.org/docs/becomingbig