![](/img/trans.png)
[英]Flask.g database connection - RuntimeError: Working outside of application context
[英]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.db
和g.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.