首页 > 解决方案 > 将烧瓶应用程序转换为应用程序工厂模式会破坏所有导入

问题描述

所以我一直在构建一个烧瓶应用程序,只使用一个app.py文件并运行它。它现在有一个相当大的应用程序,我现在只是想把它转换成一个应用程序工厂,因为我需要在我的 Celery 任务中使用 SQLAlchemy。

这是我的应用程序文件夹中的init .py

def create_app():
    load_dotenv(".env")
    app = Flask(__name__)

    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///data.db"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config["PROPAGATE_EXCEPTIONS"] = True
    app.config["BROKER_URL"] = os.getenv("REDIS_BACKEND_BROKER")
    app.config["CELERY_BROKER_URL"] = os.getenv("REDIS_BACKEND_BROKER")
    app.config["CELERY_IMPORTS"] = "celery_tasks"
    app.secret_key = os.getenv("SECRET_KEY")

    CORS(app)
    api = Api(app)
    jwt = JWTManager(app)

    db.init_app(app)
    ma.init_app(app)
    celery.init_app(app)

    @app.before_first_request
    def create_tables():
        db.create_all()

    @jwt.invalid_token_loader
    def invalid_token_callback(self):
        return {"message": "invalid"}, 401

    with app.app_context():

        from .resources.auth import Auth, CheckUser
        from .resources.period import Period
        from .resources.project import Project
        from .resources.session import Session

        api.add_resource(Auth, "/auth")
        api.add_resource(CheckUser, "/check")
        api.add_resource(Project, "/createproject")
        api.add_resource(Period, "/createperiod")
        api.add_resource(Session, "/createsession")
        return app

问题是所有正在导入的资源都会中断,因为它们也不能再基于模块导入。

例如 resources.period 还导入 SQLAlchemy 模型和 Masrhmallow 模式

资源/期间.py

#THESE ARE NO LONGER IMPORTED SUCCESSFULLY

from models.project import ProjectModel
from schemas.task import TaskSchema
from schemas.period import PeriodSchema

这是我的文件结构

标签: pythonflask

解决方案


这是 Miguel Grinberg 的一个很棒的教程,他在其中重构了一个完整的应用程序,就像你想要的那样:

https://www.youtube.com/watch?v=NH-8oLHUyDc&t=2934s

您是否尝试过进行“绝对”导入,例如:

from app.models.project import ProjectModel

推荐阅读