【发布时间】:2019-08-30 23:34:21
【问题描述】:
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航班搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与push() 一起工作,但不能让with 块工作。
fly_app/__init.py__
我的原始代码:
from flask import Flask
from config import Config
import logging
from logging.handlers import RotatingFileHandler
import os
app = Flask(__name__)
app.config.from_object(Config)
if not app.debug:
...
from fly_app import routes, errors # noqa
我根据需要将应用导入到其他模块。
现在该文件已被重构为这个并且似乎可以工作:
from flask import Flask
import logging
from logging.handlers import RotatingFileHandler
import os
def create_app():
# create and configure the app
app = Flask(__name__)
app.config.from_mapping(
SECRET_KEY=os.environ.get('SECRET_KEY', 'nice-try')
)
app.app_context().push()
if not app.debug and not app.testing:
...
from . import routes
app.register_blueprint(routes.bp)
return app
我需要 app_context 以便可以在其他模块中使用 current_app.static_folder 和 current_app.logger.exception()。我读过使用with 块,例如,
with app.app_context():
init_db()
优于
app.app_context().push()
来自 Flask 文档:“在 with 块中使用 app_context(),并且在该块中运行的所有内容都可以访问 current_app。”
我的问题:
-
with块有何不同或优于使用app.app_context().push()? - 在我的原始代码中使用
push()是否等于将app设置为全局变量,从而一无所获? - 我无法弄清楚如何在不引发“RuntimeError:在应用程序上下文之外工作”的情况下让
with块工作。我尝试了with块,包括:app.static_folder-
current_app(导入后)或current_app.[attr] - 特定的 module.methods() 或使用 current_app 的属性
例如,我编写了两个自定义验证器 - code_check 和 currency_check - 用于从 forms.py 模块中的 flask_wtf.FlaskForm 派生的类。这些采用 form 和 field 位置参数,我无法将它们放入 with 块中,因为它们未定义。
作为一个相对新手,尽管阅读文档和搜索互联网,但我显然不了解应用程序上下文的工作原理。
【问题讨论】:
标签: flask