【问题标题】:Flask python app failing to get app object after initializingFlask python app初始化后无法获取app对象
【发布时间】:2017-09-12 10:08:01
【问题描述】:

app_instance.py

from app import FlaskApp

app = None


def init_instance(env):
    global app
    app = FlaskApp(env)


def get_instance():
    assert app is not None
    return app

FlaskApp class 差不多是这样的

class FlaskApp(object):

    def __init__(self, env):
        self.oauth_manager = .... bla bla ..
        self.clients_manager = .. bla bla ..

        app = Flask(__name__)    
        app.config.from_object(env)    
        app = app_wrapper.wrap(app, app.config['NUM_PROXY_SERVERS'])    
        self.app = app

        self.api = Api(self.app, prefix='/v3', default_mediatype='application/json')
        self.define_routes()
        # Initialize the DB
        self.db = Database(self.app)

        fmt = "%(asctime)s - %(request_id)s - %(name)s - %(levelname)s - %(message)s"
        logging.basicConfig(format=fmt, level=self.app.config.get('LOG_LEVEL'))    
        request_id.init(app, prefix='MY_API_', internal=False)

    def run_server(self):
        self.app.run(host=self.app.config['HOST'], port=self.app.config['PORT'], debug=self.app.config['DEBUG'])

    def define_routes(self):
        # Configure Api Resources
        self.api.add_resource(VersionListController, '/my/route', endpoint='versions')
        more routes here

        self.api.init_app(self.app)

在我的应用控制器中

def is_valid_oauth_token(request):
    from mobile_module import app_instance

    app = app_instance.get_instance()
    # more code here

我正在本地主机上运行应用程序并获取

    assert app is not None
AssertionError

如何“修复”此代码?我应该在每个路由访问中导入from mobile_module import app_instance 吗?请提出建议

我应该声明这个应用程序在 Nginx 之后的生产环境中运行良好

我想我的问题更多是关于 python(如何使这项工作)而不是烧瓶。

【问题讨论】:

  • 您是否尝试使用app contextfrom flask import current_app...
  • 你能给我们FlaskApp类的代码吗??
  • @EspoirMurhabazi 添加到问题中
  • 好的,!但是您如何看待在我的回答中使用应用工厂设计模式 ass 建议?
  • @DanilaGanchar app_context 成功了。请把你的答案写成答案,我会批准

标签: python python-2.7 flask


【解决方案1】:

该问题与get_instanceinit_instance(create_app 等) 无关。

Flask 有different states。当您初始化app instance(FlaskApp(env)) 时,应用程序将在请求上下文之外工作。

正如我在您的示例中看到的,您尝试在请求的上下文中获取应用程序 (def is_valid_oauth_token(request))。这意味着这不是应用程序的初始化。这是在请求处于活动状态时进行的处理。这是应用程序的其他状态 - 应用程序已创建并在某些请求的上下文中工作。在这种情况下,您可以使用from flask import current_app 获取应用程序实例。

为了更好地理解它是如何工作/使用的,我建议阅读 flask._app_ctx_stackapp_context()flask.g

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我认为开发一个简单的烧瓶应用程序的最好方法是遵循关于简单烧瓶项目结构的官方文档here

    你需要像这样组织你的floder:

    /yourapplication
        /yourapplication
            __init__.py
            /static
                style.css
            /templates
                layout.html
                index.html
                login.html
                ...
    

    然后在 init.py 文件中创建您的应用程序,如下所示:

    from flask import Flask
    def create_app():
        """this method will initialise the flask Ap instance """
    
        app = Flask(__name__)
    
        @app.route('/')
        def hello_world():
            return 'Hello, World!'
        return app
    

    在您的应用程序目录中添加 run.py 以使用以下代码运行应用程序:

    from yourapplication import create_app
    
    app = create_app()
    
    if __name__ == '__main__':
        app.run()
    

    如果你想使用你的控制器,你可以这样做:

    from yourapplication import create_app
    def is_valid_oauth_token(request):
        app = create_app()
        # more code here
    

    这叫做应用工厂design-pattern

    此外,如果您想将其投入生产,您将需要使用 WSGI 配置查找更多 here

    【讨论】:

    • 这不是您链接的教程中建议的方式。在您的views.py 中使用import app from foo 并在__init__.py 中导入views 以允许自动检测路线。
    • 谢谢,我现在添加了正确的链接,我说的是 [app factory(flask.pocoo.org/docs/0.12/patterns/appfactories) 设计模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2015-10-05
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多