Django视图获取URL参数报错,请求解决路由匹配问题
解决方案
1. 修复URL路由配置
你的路由配置混合了正则表达式语法和路径转换器语法,导致无法匹配路径api/det/1,需要二选一修改:
方式一:使用Django 2.0+推荐的path语法
from django.urls import path from . import views urlpatterns = [ path('api/det/<int:id>/', views.DetailsAPI.as_view(), name='DetailsAPI'), ]
方式二:使用正则表达式(re_path/url)
from django.conf.urls import url from . import views urlpatterns = [ url(r'^api/det/(?P<id>\d+)/$', views.DetailsAPI.as_view(), name='DetailsAPI'), ]
注意:路由末尾的
/是Django默认要求的(可通过APPEND_SLASH=False关闭,但不推荐),必须加上才能匹配路径。
2. 修复视图方法签名与参数获取
你的DetailsAPI的get方法参数签名错误,APIView的视图方法必须以request作为第一个参数,且参数需通过kwargs获取:
class DetailsAPI(APIView): def get(self, request, *args, **kwargs): # 从kwargs中获取URL参数id id = kwargs.get('id') # 优化:直接用ORM过滤数据,避免全表查询后再筛选 filter_list = Details.objects.filter(id=id) df = read_frame(filter_list) df_final = df.to_json(orient='records') return HttpResponse(df_final, content_type='application/json')
关键错误点说明:
- 原视图
get方法直接写id作为参数,不符合APIView的方法签名规范,会导致参数不匹配报错。 - 原路由语法错误,
url()(即re_path())不支持<int:id>这种路径转换器语法,必须用正则分组(?P<id>\d+);若要用<int:id>,需使用path()函数。
内容的提问来源于stack exchange,提问作者anuof90
相关产品推荐
相关产品推荐

