gpt4 book ai didi

Flask 应用程序上下文 : app. app_context().push() 工作,但无法让 "with app.app_context()" block 工作

转载 作者:行者123 更新时间:2023-12-03 23:10:48 39 4
gpt4 key购买 nike

我是 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 block ,例如,
with app.app_context():
init_db()

优先于
app.app_context().push()

来自 Flask 文档:“在 with block 中使用 app_context(),在 block 中运行的所有内容都可以访问 current_app。”

我的问题:
  • with 怎么样 block 不同或比使用更好app.app_context().push() ?
  • 是否使用 push()达制作app像我的原始代码一样的全局变量,因此什么也没做?
  • 我不知道如何获得 with在不引发“RuntimeError:在应用程序上下文之外工作”的情况下阻止工作。我试过 with block 包括:
  • app.static_folder
  • current_app (导入后)或current_app.[attr]
  • 使用 current_app
  • 的特定 module.methods() 或属性

    例如,我编写了两个自定义验证器——code_check 和 currency_check——用于派生自 flask_wtf.FlaskForm 的类。在 forms.py模块。这些采取 formfield我无法放入 with block 中的位置参数,因为它们是未定义的。

    作为一个相对新手,尽管阅读文档和搜索互联网,我显然不了解应用程序上下文是如何工作的。

    最佳答案

    Flask 新手时将来自多个来源的代码拼凑在一起是一种挫败感。我看到了你前进的方向,强烈建议你通读 Miguel Grinberg 的 Flask Mega Tutorial .它提供了一条路径,可以让您更好地了解 Flask 的工作原理。

    (提示:app.app_context().push() 中不需要 create_app() )

    关于Flask 应用程序上下文 : app. app_context().push() 工作,但无法让 "with app.app_context()" block 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734132/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com