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

Django+DRF项目配置自定义404页面后正常链接返回服务端错误如何解决?

问题根因

你遇到的问题由两个常见的配置错误导致:

  1. 错误使用DRF路由器注册非视图集类
    DRF的DefaultRouter/SimpleRouter仅支持注册继承自ViewSet的视图类,你代码中注册的ContactAPIView如果是普通APIView子类而非视图集,路由匹配后会因为无法映射标准动作抛出异常,返回500错误。
  2. 空路径视图集路由拦截范围过大
    你在accounts/urls.py中注册了空路径r''对应的ProfileView,该路由会匹配所有/me/前缀下未被其他路由匹配的路径,如果ProfileView的逻辑存在参数校验、权限判断等问题,也会导致正常访问抛出异常。

解决步骤

  1. 修正非视图集的路由配置
    将所有非视图集类的路由从路由器注册中移除,改用标准path配置,示例如下:
# accounts/urls.py 修正后的配置
from django.urls import path, include
from .views import ContactAPIView, ProfileView, AdminContactView, AddressLinkView
from rest_framework import routers
from django.contrib.auth import views as auth_views
from rest_framework.authtoken.views import obtain_auth_token

router = routers.DefaultRouter()
# 仅保留继承自ViewSet的视图类的注册
router.register(r'phones',AdminContactView, basename='phone')
router.register(r'addresses',AddressLinkView, basename='addresses')

 
urlpatterns = [
     path('api-auth/', include('rest_framework.urls')),
     # 普通APIView改用path配置
     path('contact/', ContactAPIView.as_view(), name='contact'),
     # 手动配置ProfileView的对应动作,示例为GET请求的列表视图
     path('', ProfileView.as_view({'get': 'list'}), name='profile'),

     path('password-reset/',
          auth_views.PasswordResetView.as_view(),
          name='password_reset'),
     path('password-reset/done/',
          auth_views.PasswordResetDoneView.as_view(
               template_name='password_reset_done.html'
          ),
          name='password_reset_done'),
     path('password-reset-confirm/<uidb64>/<token>/',
          auth_views.PasswordResetConfirmView.as_view(),
          name='password_reset_confirm'),
     path('password-reset-complete/',
          auth_views.PasswordResetCompleteView.as_view(),
          name='password_reset_complete'),
]

urlpatterns += router.urls
  1. 临时开启DEBUG定位具体异常
    你当前DEBUG = False无法看到具体报错信息,临时修改为DEBUG = True后访问报错路径,可直接拿到异常栈信息,快速定位其他潜在问题。
  2. 检查路径匹配逻辑
    确认my_works应用下的路由拼写和你访问的路径一致,比如你举例的/en/book需要对应存在book的路由规则,而非你当前注册的带s后缀的books。
  3. 确认自定义404视图参数正确
    你配置的error_404_view必须接收request和exception两个参数,示例正确写法如下:
# accounts/views.py
from django.shortcuts import render

def error_404_view(request, exception):
    return render(request, '404.html', status=404)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:42:00