Heroku部署Flask项目报NameError: name 'model' is not defined如何解决
Heroku部署Flask应用时
NameError: name 'model' is not defined问题解析 错误核心原因
你写的导入逻辑和调用逻辑不匹配:
- 当前使用的导入语句是
from model import *,该语法的实际效果是将model.py内的所有公开函数、类、变量直接导入到app.py的全局命名空间,不会把model.py本身作为一个名为model的可引用模块对象存入当前命名空间 - 你的业务代码采用
model.get_notes()的形式调用方法,本质是要求解释器查找名为model的模块实体并调用其内部方法,但现有导入逻辑根本没有创建这个名称的模块引用,因此解释器执行到该行代码时无法识别model,直接触发NameError - 本地运行正常、Heroku环境报错的差异来源:本地环境可能存在Python导入缓存、历史导入残留的兼容状态,让代码误打误撞跑通;但Heroku是完全隔离的全新运行环境,会严格按照Python语法规则解析导入逻辑,没有缓存机制“打补丁”,直接暴露导入和调用不匹配的问题
修正方案
- 最适配现有调用逻辑的改法:将model.py的导入语句替换为
import model,原有带model.前缀的业务代码不需要做任何修改即可正常运行 - 若坚持使用
from model import *的导入形式,需要将业务代码中所有带model.前缀的调用去掉前缀,比如把model.get_notes()改为直接调用get_notes()——因为模块内的对象已经直接导入到当前文件命名空间下,不需要再加模块名做标识 - 你当前配置的Procfile内容本身没有问题,
web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app是适配Gevent WebSocket Worker的gunicorn启动逻辑,和本次报错无关联
内容的提问来源于stack exchange,提问作者Denis Ladoshkin
相关产品推荐
相关产品推荐

