初始化后,Flask python app无法获取app对象

时间:2017-09-12 10:08:01

标签: python python-2.7 flask

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 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)

在我的app控制器中

def is_valid_oauth_token(request):
    from mobile_module import app_instance

    app = app_instance.get_instance()
    # more code here

我在localhost上运行应用程序并获取

    assert app is not None
AssertionError

如何修复"这段代码?我应该在每次路径访问中导入from mobile_module import app_instance吗?建议请

我应该声明这个应用程序在Nginx之后的生产中工作

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

2 个答案:

答案 0 :(得分:1)

该问题与get_instanceinit_instancecreate_app等)无关。

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

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

为了更好地了解其工作原理/使用方法,我建议您阅读flask._app_ctx_stackapp_context()flask.g

希望这有帮助。

答案 1 :(得分:0)

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

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

  select w.worker_id,   w.lastname,pd.invalid
                                 from workers w,personal_data pd
                                 where pd.worker_id (+) = w.worker_id
                                 and pd.invalid =nvl(:p_invalid,pd_invalid)

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

/yourapplication
    /yourapplication
        __init__.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...
在您的yourapplication目录中

添加run.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

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

from yourapplication import create_app

app = create_app()

if __name__ == '__main__':
    app.run()

这称为应用程序工厂design-pattern

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