Flask、Marshmallow 和 Sqlalchemy 工厂问题

问题描述 投票:0回答:1

我正在构建一个 Flask RESTful 应用程序,并且尝试使用工厂设计模式来构建它,但我认为我遗漏了一些东西。这是我的设置文件

app.py:`

from src import create_app, ext_celery

app = create_app("development")
celery = ext_celery.celery

src/init.py:

db = SQLAlchemy()
ext_celery = FlaskCeleryExt(create_celery_app=make_celery)

def create_app(config_name=None):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    ext_celery.init_app(app)

    api = Api(app, errors=errors)
    initialize_routes(api)

    return app

我的问题出在 user/view.py 文件中。如果我尝试将 db import 语句放在文件顶部,则会出现循环引用错误:

ImportError: cannot import name 'db' from partially initialized module 'src' (most likely due to a circular import) (/app/src/__init__.py)

所以我必须将其移至方法内部才能使其正常工作。我的 user/view.py put 函数如下所示:

    @token_required
    def put(self, user):
        data = request.json
        from .schema import user_get_schema
        from src import db
        updated_user = user_get_schema.load(data, session=db.session)
        from models import Users
        ...

如果我尝试导入方法调用上方的架构或模型,我会遇到同样的问题。这是它应该如何工作的吗?我必须为每个视图导入这些项目?这对我来说似乎不对,但我不知道还能怎么做。我还在努力学习Python。

谢谢你

python flask sqlalchemy factory marshmallow
1个回答
0
投票

您正在使用循环导入。您应该将所有连接第三个应用程序移动到另一个文件,例如 src/extension.py

src/extension.py

from flask_sqlalchemy import SQLAlchemy
from flask_celeryext import FlaskCeleryExt


db = SQLAlchemy()
ext_celery = FlaskCeleryExt(create_celery_app=make_celery)

src/init.py:

from src.extension import db, ext_celery

def create_app(config_name=None):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    ext_celery.init_app(app)

    api = Api(app, errors=errors)
    initialize_routes(api)

    return app

在所有文件模型或视图中,您将使用

from src.extension import db
。现在,所有文件将从一个文件的一个连接导入,以避免循环导入

© www.soinside.com 2019 - 2024. All rights reserved.