You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django无法使用应用目录外的前端文件夹配置视图

解决Django 2.0中TemplateDoesNotExist加载前端index.html的问题

首先,你的核心问题是误用了Django旧版本的模板配置——Django 2.0已经完全弃用了TEMPLATE_DIRS和TEMPLATE_LOADERS这两个配置项,改用统一的TEMPLATES配置块,所以你硬编码的模板路径根本没被系统读取,导致模板加载器只会去各个app的templates目录下查找,自然找不到你放在front-end/html里的index.html。

下面是具体的修复步骤:

1. 更新settings.py中的模板配置

删掉你当前的TEMPLATE_DIRS和TEMPLATE_LOADERS,替换成Django 2.0要求的TEMPLATES结构:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 用BASE_DIR拼接路径,避免硬编码,跨系统也能正常工作
        'DIRS': [os.path.join(BASE_DIR, 'front-end', 'html')],
        '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',
            ],
        },
    },
]

这样配置后,Django的文件系统加载器会优先去你指定的front-end/html目录查找模板。

2. 验证urls.py的首页路由

你的现有路由写法是没问题的,但可以优化成更符合Django 2.x风格的path语法:

from django.views.generic.base import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
    # 用path替代url,更简洁
    path('', TemplateView.as_view(template_name='index.html'), name='home'),
    # 下面的路由保留,但注意删掉重复的rest-auth/login路由
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls')),
    # 删掉这行重复路由:path('rest-auth/login/', include('rest_auth.registration.urls')),
    path('refresh-token/', refresh_jwt_token),
    path('user/', DetailsView.as_view(), name='rest_user_details'),
    path('', include('api.urls')),
    path('api/v1/skills/', wantedly_app_views.skill_collection),
    path('api/v1/skills/<int:pk>/', wantedly_app_views.skill_element),
    path('api/v1/user/skills/<int:pk>/', wantedly_app_views.user_skill_collection),
    path('api/v1/user/skill/upvotes/<int:pk>/', wantedly_app_views.user_skill_upvotes),
]

注意:你之前的rest-auth/login路由是重复的,rest_auth.urls已经包含了login接口,这行重复路由会导致冲突,一定要删掉。

3. (可选)前后端分离场景的更优方案

如果你的前端是纯静态HTML/CSS/JS,不需要Django模板引擎渲染(比如没有模板变量、标签),那其实可以直接返回静态文件,不用走模板流程:

  • 在你的app里新建一个视图(比如views.py):
from django.http import FileResponse
import os
from django.conf import settings

def serve_frontend_index(request):
    index_path = os.path.join(settings.BASE_DIR, 'front-end', 'html', 'index.html')
    return FileResponse(open(index_path, 'rb'), content_type='text/html')
  • 然后在urls.py里替换TemplateView:
path('', views.serve_frontend_index, name='home'),

这种方式更适合前后端分离的架构,避免不必要的模板引擎处理。

做完以上修改后,重启Django服务器,访问http://localhost:8000/应该就能正常加载你的前端首页了。


内容的提问来源于stack exchange,提问作者Divyanshu Jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:49:22