Flask-Script 如何获取当前应用?

4 投票
1 回答
13060 浏览
提问于 2025-04-21 08:00

我想从Flask-Script的manager.command中获取当前应用的实例。

这样做会出错(url_map是flask.app的一个属性)。

@manager.command
def my_function():
    x = app.url_map # this fails, because app is a callable
    print "hi"

这样做是可以的,但我不喜欢在app后面加括号。

@manager.command
def my_function():
    x = app().url_map
    print "hi"

调试器显示app是一个可调用的对象。这和我创建应用实例的方式有关。我遵循了这个模式:

def create_app(settings=None, app_name=None, blueprints=None):
    ...lots of stuff...
    app = flask.Flask(app_name)
    ...lots of stuff...
    return app


def create_manager(app):
    manager = Manager(app)


    @manager.command
    def my_function():
        x = app.url_map
        print "hi"


def main():
    manager = create_manager(create_app)
    manager.run()


if __name__ == "__main__":
    main()

flask-script的文档提到关于Manager(app)的app参数:

app – Flask实例,或者返回Flask实例的可调用对象。

我觉得把一个可调用的对象放进去没问题,因为文档说这样可以。:-) 而且我也看到其他人是这么做的。

但现在我有一个附加的命令想要添加,它让我必须在app后面加括号,这让我觉得不太对劲。我到底哪里出错了?

编辑:我做了一些实验。这确实是错的。加上括号后,app实例被重新创建了一次。

1 个回答

17

使用 flask.current_app

这样做是有效的:

    import flask

... other stuff ...

    @manager.command
    def my_function():
        x = flask.current_app.url_map
        print "hi"

我想得太复杂了。:-)

撰写回答