部署到Heroku时修改Django应用名称引发的问题咨询
看起来你只做了最基础的重命名操作,漏掉了很多隐藏的引用,这才导致应用找不到workout模块。下面是所有你需要检查并修改的地方:
项目根URL配置文件(
urls.py)
这里大概率有引用原应用的URL路由,比如:from django.urls import include urlpatterns = [ path("", include("workout.urls")), # 替换成 "workoutcalendar.urls" ]如果给应用设置了命名空间,也要同步修改命名空间的名称。
settings.py中的关键配置- 首先是
INSTALLED_APPS,你肯定在这里注册过原应用:INSTALLED_APPS = [ # ... 其他应用 "workoutcalendar", # 替换原来的 "workout" ] - 另外检查settings里的其他配置,比如
LOGIN_REDIRECT_URL、LOGOUT_REDIRECT_URL或者你自定义的任何引用workout的变量,都要改成新名称。
- 首先是
应用内部的所有导入语句
遍历workoutcalendar文件夹下的views.py、models.py、admin.py、forms.py等所有Python文件,把所有绝对导入里的workout替换成workoutcalendar,比如:# 旧代码 from workout.models import WorkoutPlan from workout.views import dashboard # 新代码 from workoutcalendar.models import WorkoutPlan from workoutcalendar.views import dashboardadmin.py中的模型注册
这里肯定有导入原应用模型的代码,同步修改:from django.contrib import admin from workoutcalendar.models import WorkoutPlan # 替换原来的 workout.models admin.site.register(WorkoutPlan)模板文件中的URL反向解析
模板里如果用了{% url 'workout:dashboard' %}这种命名空间式的反向URL,要把命名空间改成workoutcalendar:{% url 'workoutcalendar:dashboard' %}WSGI/ASGI启动文件
检查项目根目录的wsgi.py和asgi.py,如果有硬编码的原模块名,比如:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "workout.settings")替换成
"workoutcalendar.settings"(虽然你改了环境变量,但硬编码的地方也得同步改)。Heroku的
Procfile配置
如果你的Procfile里有启动命令,比如:web: gunicorn workout.wsgi --log-file -要把
workout.wsgi改成workoutcalendar.wsgi。数据库迁移文件(可选但推荐)
迁移文件里会记录原应用的名称,虽然不修改也能正常运行,但为了项目整洁,可以用全局替换把迁移文件里的'workout'换成'workoutcalendar',或者干脆删除migrations文件夹下除了__init__.py的所有文件,重新运行python manage.py makemigrations和python manage.py migrate生成新的迁移记录(操作前记得备份数据库)。
最后一个小技巧:用全局搜索工具(比如终端里的grep -r "workout" .,或者IDE的全局搜索)扫描整个项目,找出所有遗漏的workout引用,确保没有漏网之鱼。本地测试没问题后再推送到Heroku就可以解决这个报错了。
内容的提问来源于stack exchange,提问作者Sahand

