我正在构建一个 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。
谢谢你
您正在使用循环导入。您应该将所有连接第三个应用程序移动到另一个文件,例如 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
。现在,所有文件将从一个文件的一个连接导入,以避免循环导入