【问题标题】:How to import app instance created from create_app()如何导入从 create_app() 创建的应用实例
【发布时间】:2021-01-29 07:01:03
【问题描述】:

我如何导入在app/app.pycreate_app() 函数中创建的app 实例以在app/api.py 中使用,因为app 实例仅返回到我的manage.py

我的项目结构:

project/
    app/
        api.py
        app.py
        models.py
        schema.py
        ...
    manage.py
    requirements.txt
    README.md

我正在使用命令 python manage.py 启动我的开发应用程序

# manage.py
from app.app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True, host='localhost', port=5000)
# app/app.py
def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['SQLALCHEMY_DATABASE_URI'] = config['mysql']['db_uri']
    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_recycle': 3000, 'pool_pre_ping': True, }

    register_extensions(app)

    @app.before_first_request
    def setup_logging():
        gunicorn_error_logger = logging.getLogger('gunicorn.error')
        app.logger.handlers.extend(gunicorn_error_logger.handlers)
        app.logger.setLevel(gunicorn_error_logger.level)

    return app

def register_extensions(app):
    db.init_app(app)
    api.init_app(app)
# app/api.py
from flask import Flask, jsonify
from flask_restful import Api, Resource

api = Api()


class TestGet(Resource):

    def get(self):
        app.logger.info('ok') ## Here I wish to use the app instance for logging
        return 'ok'

api.add_resource(TestGet, '/ok')

如何导入app 实例到app/api.py 以便我可以使用app.logger.info(...)

如果我调用create_app(),它将创建一个新实例,而不是已经在运行的实例?

【问题讨论】:

    标签: python-3.x flask flask-restful


    【解决方案1】:

    无需导入应用。

    您可以使用current_app 助手。

    from flask import current_app

    您可以将其视为应用实例的代理。

    官方文档链接:

    https://flask.palletsprojects.com/en/1.1.x/appcontext/#the-application-context

    https://flask.palletsprojects.com/en/1.1.x/api/#flask.current_app

    Miguel Grinberg 还提供了有关此主题的非常好的信息:

    https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-a-better-application-structure

    (在页面搜索current_app

    【讨论】:

    • 是不是和app/api.py里面加app = Flask(__name__)一样?
    • 不,它是一个代理 - 假设您从两个不同的窗口查看同一个对象。另一方面,app = Flask(__name__) 创建了第二个实例。我将使用 Flask 文档中的 current_app 链接更新上述答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2012-11-16
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多