繁体   English   中英

具有应用程序上下文的 cli 命令中不存在 flask.g 的属性

[英]Attributes of flask.g not exist in cli command with app context

我使用烧瓶应用工厂:

app.py

from flask import Flask, g

from . import commands
from .database import DatabaseManager
from .extensions import db
from .settings import ProdConfig


def create_app(config_object=ProdConfig):
    '''Flask app factory'''
    app = Flask(__name__)
    app.url_map.strict_slashes = False
    app.config.from_object(config_object)

    register_extensions(app)
    register_blueprints(app)
    register_commands(app)

    @app.before_request
    def create_context():
        g.db = db.database
        g.db_manager = DatabaseManager()

    return app

# Another functions
# ...

def register_commands(app):
    app.cli.add_command(commands.root_group)

然后我写了命令:

commands.py

from flask import g
from flask.cli import AppGroup

root_group = AppGroup('myapp')

@root_group.command('test')
def test():
    print(g.db)

然后,当我运行命令flask myapp test时,我在g.db上得到AttributeError 所以不知何故, flask.g没有收到在before_request中初始化的 attrs g.dbg.db_manager 据我了解,它必须接收,因为当基于AppGroup的 cli 命令运行时,必须推送 app_context。 如何解决这个问题?

从测试中我了解到,当 CLI 命令执行时,Flask 不会推送请求上下文,所以@before_request钩子不会执行。 我没有找到在我的 cli 命令中推送请求上下文并进行此破解的好方法:

@root_group.command()
def test():
    exec_before_request_hooks()
    print(g.db_manager)



# HACK: run @app.before_request for CLI command
def exec_before_request_hooks():
    current_app.test_client().get()

如果有人知道更好的解决方案,我将非常感激听到它)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM