Python 烧瓶应用程序循环依赖项
我正在开发一个Flask应用程序,我不确定为什么会出现此错误:Python 烧瓶应用程序循环依赖项,python,flask,model,flask-restful,Python,Flask,Model,Flask Restful,我正在开发一个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 Use
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)
端点/用户/model.py:
from app import db
class User(db.Model):
# info about the class, requires db
端点/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中,由于我是在创建db后从endpoints.users.resource导入的,所以这不应该绕过循环依赖吗
另外,我可以使用
flask run
运行这个程序,但是当我尝试使用python app.py
时,它会给出上面的错误。为什么这些会产生不同的结果?那么从endpoints.users.resource导入UserResource行python尝试从app import db行导入到app.py
,这会导致app
引用自身,这一点都不好
解决Flask中循环导入错误的一个解决方法是使用大多数Flask应用程序中存在的init_app
函数。因此,只需创建数据库文件,如下所示:
.
├── app.py
└── database.py/
└── endpoints/
├── __init__.py
└── users/
├── __init__.py
├── model.py
└── resource.py
database.py
从flask\u sqlalchemy导入sqlalchemy
db=SQLAlchemy()
app.py
从烧瓶导入烧瓶
从restful导入Api
从数据库导入数据库
从endpoints.users.resource导入UserResource
app=烧瓶(名称)
app.config.from_对象(config)
db.init_应用程序(应用程序)
api=api(应用程序)
api.prefix='/api'
api.add_资源(UserResource,“/users”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序运行(host=“0.0.0.0”)
端点/用户/model.py:
from app import db
class User(db.Model):
# info about the class, requires db
从数据库导入数据库
类用户(db.Model):
#关于类的信息,需要数据库
端点/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
来自flask\u restful导入资源
从endpoints.users.model导入用户
从数据库导入数据库
类用户资源(资源):
def get(self,username=None):
#获取请求,需要数据库和用户
请注意,我重写了从相关文件导入的内容,因此不要忘记添加\uuuu init\uuuuu.py
文件
您的结构如下所示:
.
├── app.py
└── database.py/
└── endpoints/
├── __init__.py
└── users/
├── __init__.py
├── model.py
└── resource.py
谢谢你的帮助!\uuuu init\uuuuu.py
文件用于什么?@user11799它们用于帮助python索引模块。因此,当您启动app.py
时,python会在每个子目录中递归地运行并检查这些文件,并且您只能导入模块,其中包含\uuuu init\uuuu.py
。最好的做法是在每个子目录中都包含\uuuuu init\uuuuuu.py
文件(但不在根目录中)。文件可能为空。@user11799如果您没有这些文件,则导入的唯一方法是相对导入(就像您使用.model import User
中的),但此方法的缺点是无法从父目录导入。在我的示例中,我们想要导入数据库
文件,该文件比模型