部署Django项目至Railway时遭遇模板不存在错误求助
部署Django到Railway时「Django template does not exist」错误排查与解决
错误信息
django.template.loaders.filesystem.Loader: /app/client/client/public/index.html (Source does not exist)
相关代码
project/settings.py
from pathlib import Path import os BASE_DIR = Path(__file__).resolve().parent.parent DEBUG = True TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'client') ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'project.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'game-api', 'HOST': 'localhost', 'PORT': 5432 } } ROOT_URLCONF = 'project.urls' STATIC_URL = '/static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' import dj_database_url db_from_env = dj_database_url.config(conn_max_age=500) DATABASES['default'].update(db_from_env) STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
project/views.py
from django.shortcuts import render def index(request): return render(request, 'build/index.html')
项目结构
项目根目录包含两个核心文件夹:
client:前端文件目录,内部有public子目录(存放index.html及静态资源)project:Django项目核心配置目录
问题分析
从日志路径/app/client/client/public/index.html能看出,Django模板查找时出现了路径嵌套错误。结合配置和文件结构,核心问题是模板目录配置与实际文件路径不匹配:
TEMPLATES.DIRS设置为BASE_DIR/client,但前端index.html实际在BASE_DIR/client/public下- 视图中渲染的
build/index.html是不存在的路径,实际应该指向public/index.html
解决方案
1. 修正模板目录配置
修改settings.py中的TEMPLATES.DIRS,指向正确的前端模板目录:
TEMPLATES = [ { # 其他配置保持不变 'DIRS': [os.path.join(BASE_DIR, 'client', 'public')], # 其他配置保持不变 }, ]
2. 修正视图中的模板路径
将views.py中的渲染路径改为实际存在的文件(已将DIRS指向public目录,直接写文件名即可):
def index(request): return render(request, 'index.html')
3. 确保部署时文件被正确包含
检查项目的.gitignore文件,确认client/public目录没有被排除,否则Railway部署时无法获取到模板文件。
4. 优化生产环境配置(可选但推荐)
- 将
DEBUG改为生产环境适配的动态配置:DEBUG = os.environ.get('DEBUG', 'False') == 'True' - 补充静态文件配置,适配Whitenoise:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATICFILES_DIRS = [os.path.join(BASE_DIR, 'client', 'public', 'static')]
内容的提问来源于stack exchange,提问作者rokster
相关产品推荐
相关产品推荐

