使用cookiecutter-flask创建site子模块后Flask Shell报AttributeError
我之前也踩过这个坑!照着cookiecutter-flask的user模块复刻site蓝图,跑服务、测用例都顺风顺水,一进flask shell就报错,核心原因是模块导入的触发时机差异——flask run时会通过路由或视图间接加载models,但flask shell启动时没有这些触发点,得主动把models导入到蓝图模块里。
下面是一步步的排查和解决方法:
1. 检查你的webapp/site/__init__.py
打开user模块的__init__.py对比,你会发现它最后一行肯定有类似这样的代码:
from webapp.user import routes, models
这行是关键!它在蓝图模块初始化时就主动导入了routes和models,确保模块被加载时这两个子模块也被注册。
如果你复制site模块时只抄了蓝图定义,漏了这行,那flask shell里直接访问webapp.site.models就会找不到——因为site模块本身没把models子模块导入进来。
修正后的webapp/site/__init__.py应该是这样:
from flask import Blueprint bp = Blueprint('site', __name__, template_folder='templates') # 必须加上这行,主动导入子模块 from webapp.site import routes, models
2. 验证导入是否正常
修改后重启flask shell,先试试直接访问:
from webapp.site import models print(models.Site) # 替换成你实际定义的模型类名
如果能正常输出类信息,说明问题解决了。
如果还是报错,那得检查:
webapp/site/models.py文件是否存在,文件名有没有拼写错误(比如写成了model.py)- models.py里的类是否正确定义,有没有语法错误
- 根目录的
app.py里是否正确注册了site蓝图:from webapp.site import bp as site_bp app.register_blueprint(site_bp, url_prefix='/site')
为什么flask run时没问题?
因为启动服务后,当有请求进来时,路由对应的视图函数会被加载,而视图函数里大概率会导入models(比如查询Site数据),这就间接触发了models模块的加载。但flask shell是纯交互式环境,没有请求触发路由,所以必须在蓝图模块初始化时主动导入models。
内容的提问来源于stack exchange,提问作者Tyler_1
相关产品推荐
相关产品推荐

