Flask 应用循环依赖

Flask Application Circular Dependencies

我正在开发 Flask 应用程序,我不确定为什么会收到此错误:

  File "app.py", line 17, in <module>
    from endpoints.users.resource import UserResource
  File "{basedir}/endpoints/users/resource.py", line 4, in <module>
    from .model import User
  File "{basedir}/endpoints/users/model.py", line 1, in <module>
    from app import db
  File "{basedir}/app.py", line 17, in <module>
    from endpoints.users.resource import UserResource
ImportError: cannot import name 'UserResource' from 'endpoints.users.resource' ({basedir}/endpoints/users/resource.py)

我认为这是由于循环依赖,从错误来看,但我不明白为什么,因为我认为我在代码中导入东西的顺序应该可以避免这个问题:

app.py:

from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config.from_object(Config)
db = SQLAlchemy(app)

api = Api(app)
api.prefix = '/api'

from endpoints.users.resource import UserResource

api.add_resource(UserResource, '/users')
 
if __name__ == '__main__':
    app.run(host="0.0.0.0")

endpoints/users/model.py:

from app import db

class User(db.Model):
    # info about the class, requires db

endpoints/users/resource.py:

from flask_restful import Resource
from .model import User
from app import db

class UserResource(Resource):
    def get(self, username=None):
        # get request, requires db and User

在 app.py 中,因为我在创建数据库后从 endpoints.users.resource 导入,难道不应该绕过循环依赖吗?

此外,我可以使用 flask run 运行,但是当我尝试使用 python app.py 时,它会出现上述错误。为什么这些会给出不同的结果?

所以 from endpoints.users.resource import UserResource 行 python 试图将 from app import db 行导入到 app.py,这导致 app 对自身的引用,这一点都不好.

解决 Flask 中循环导入错误的一种解决方法是使用大多数 Flask 应用程序中存在的 init_app 函数。所以只需像这样创建 database 文件:

database.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

app.py

from flask import Flask
from flask_restful import Api
from database import db
from endpoints.users.resource import UserResource

app = Flask(__name__)

app.config.from_object(Config)
db.init_app(app)

api = Api(app)
api.prefix = '/api'



api.add_resource(UserResource, '/users')
 
if __name__ == '__main__':
    app.run(host="0.0.0.0")

endpoints/users/model.py:

from database import db

class User(db.Model):
    # info about the class, requires db

endpoints/users/resource.py:

from flask_restful import Resource
from endpoints.users.model import User
from database import db

class UserResource(Resource):
    def get(self, username=None):
        # get request, requires db and User

请注意,我重写了您的相关导入,所以不要忘记添加 __init__.py 个文件
你的结构将是这样的:

.
├── app.py
└── database.py/
└── endpoints/
        ├── __init__.py
        └── users/
            ├── __init__.py
            ├── model.py
            └── resource.py