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
我正在开发 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