Django GET请求访问/v1/test/uuid接口返回404问题排查
错误原因
- 路由前缀不匹配:你访问的接口地址前缀是
/v1/,但test相关路由没有配置v1前缀,Django只会匹配/test/xxx格式的请求到对应视图,带v1前缀的请求无法命中该路由。 - 路由方法使用错误:你使用了
re_path编写路由,re_path仅支持正则表达式语法,不识别Django的<uuid:uuid>路径转换器语法,即使路径前缀正确也无法完成匹配。
修复方案
第一步:修改urls.py配置
- 新增导入
path方法 - 给test路由添加
v1前缀,同时替换re_path为path
修改后代码如下:
from django.urls import re_path, path, include from rest_framework.routers import DefaultRouter from site_config import views router = DefaultRouter() router.register( r'site', views.SiteViewSet, basename='site' ) urlpatterns = [ re_path(r'^v1/', include(router.urls)), path('v1/test/<uuid:uuid>/', views.Test.as_view(), name='test'), ]
第二步(可选优化):优化视图异常处理
原视图中直接使用Site.objects.get(uuid=uuid)查询数据,当传入的uuid不存在时会直接抛出500错误,建议改为使用get_object_or_404封装查询逻辑,不存在时直接返回标准404响应:
from django.shortcuts import get_object_or_404 class Test(APIView): def get(self, request, *args, **kwargs): uuid = kwargs.get('uuid') resp = {'site': None} site = get_object_or_404(Site, uuid=uuid) resp['site'] = SiteSerializer(site).data return Response(resp)
内容的提问来源于stack exchange,提问作者Esther Suh
相关产品推荐
相关产品推荐

