Django项目新增自定义HTML模板访问被重定向问题咨询
问题修复方案
你的配置存在4个核心问题,按优先级修复即可解决重定向问题:
- 根路由顺序错误(最高优先级)
根urls.py中你把自定义路由path('custom/', include('cvat.apps.custom.urls'))放在了path('', include('cvat.apps.engine.urls'))后面。CVAT的engine模块内置了前端SPA兜底路由,会匹配所有未被前置路由命中的请求,直接转发到前端入口页,你的自定义路由放在后面根本不会被触发,请求直接被拦截重定向。
调整根路由顺序,把自定义路由移到engine路由之前:urlpatterns = [ path('admin/', admin.site.urls), path('custom/', include('cvat.apps.custom.urls')), path('django-rq/', include('django_rq.urls')), path('', include('cvat.apps.engine.urls')), ] - 应用内路由重复前缀
根路由已经给custom应用的所有路由统一拼接了/custom/前缀,你在应用自身的urls.py里又加了custom/前缀,最终拼接的路由是/custom/custom/<str:name>,属于不必要的嵌套。同时你写的路由没有加尾斜杠,不符合Django默认APPEND_SLASH=True的规则,容易触发301重定向。
修改应用内的urls.py:
改完后访问from django.urls import path from . import views urlpatterns = [ path('<str:name>/', views.CustomView), ]http://localhost:8080/custom/a即可匹配到a.html,如果你确实需要保留/custom/custom/a的路径,保留custom/前缀即可,但必须先修复路由顺序问题。 - 应用目录结构错误
你当前把__init__.py(你写的_init.py文件名错误,必须是前后双下划线的__init__.py)放在了templates/custom目录下。这个文件是Python识别包目录的标识,必须放在custom应用的根目录,和urls.py、apps.py、views.py同级。templates目录只用来存HTML模板,不需要放__init__.py。
修正后的目录结构:cvat apps custom __init__.py apps.py views.py urls.py templates custom a.html b.html ... - Nginx路由拦截(Docker部署场景必现)
CVAT默认8080端口由Nginx监听,默认配置只会把/admin、/api、/django-rq、/static这类路径转发给后端Django,其余路径全部直接返回前端SPA入口文件,请求根本到不了Django。
修改CVAT的Nginx配置,新增/custom/路径的转发规则,将该路径下的请求代理到后端Django服务,重载Nginx配置即可生效。
可选优化:注册应用时建议显式指定AppConfig类,避免配置不生效,把base.py中INSTALLED_APPS里的'cvat.apps.custom'改成'cvat.apps.custom.apps.CustomConfig'。
内容的提问来源于stack exchange,提问作者user19419247
相关产品推荐
相关产品推荐

