Django REST Framework问题:URL查询参数设置与Redis缓存API 404排查
嘿,我来帮你搞定这两个DRF相关的问题!
其实查询参数(就是URL里?后面的键值对,比如/api/rooms?status=active这种)不需要在URL配置里专门定义,因为它们是动态传递的,不属于URL路径的一部分。你只需要在视图里直接获取即可:
举个简单的例子,假设你有一个获取房间列表的视图,需要通过查询参数过滤状态:
from rest_framework.views import APIView from rest_framework.response import Response class RoomListView(APIView): def get(self, request): # 获取查询参数,第二个参数是默认值 status = request.query_params.get('status', 'all') # 这里可以根据status做数据过滤逻辑 return Response({"filter_status": status})
对应的URL配置只需要普通的路径就行,不用加任何参数:
urlpatterns = [ url(r'^rooms/$', RoomListView.as_view(), name='room-list'), ]
当你请求/rooms?status=active时,视图里就能拿到status=active;如果没传这个参数,就会用默认值all。
如果是路径参数(比如/rooms/<room_id>/这种嵌入URL路径里的参数),才需要在URL配置里用正则捕获,就像你第二个问题里的room_identifier那样。
看了你提供的代码,我帮你梳理几个可能导致404的原因,逐个排查:
可能的原因及解决方法
请求URL不匹配:
你的URL配置是r'^expire-room/(?P<room_identifier>\w+)/$',注意末尾的/$,这意味着请求的URL必须以斜杠结尾,比如/expire-room/my-room-123/。如果前端请求时没加末尾的斜杠,即使Django的APPEND_SLASH设置为True(默认是),可能也会因为重定向导致问题,建议直接让请求带上末尾斜杠,或者修改URL正则去掉/$(比如r'^expire-room/(?P<room_identifier>\w+)/?$',?表示斜杠可选)。room_identifier格式不匹配正则:
你用的\w+只能匹配字母、数字和下划线,如果你的room_identifier包含其他字符(比如连字符-、点号.),正则就匹配不上,直接返回404。可以修改正则来支持更多字符,比如:urlpatterns = [ # 允许字母、数字、下划线、连字符和点号 url(r'^expire-room/(?P<room_identifier>[\w\-.]+)/$', ExpireRoom.as_view(), name='core_ExpireRoom_deletingRoom') ]URL前缀问题:
如果这个urls.py是被主项目的urls.py通过include引入的,比如主urls里有:urlpatterns = [ url(r'^api/v1/', include('your_app.urls')), ]那完整的请求URL应该是
/api/v1/expire-room/my-room-123/,如果前端直接请求/expire-room/my-room-123/就会找不到路径,返回404。URL规则顺序问题:
检查你的urlpatterns里是否有其他规则在这个规则前面,并且能匹配到请求路径。比如如果前面有r'^expire-room/$',虽然不会冲突,但如果有r'^expire-room'(没有结尾的$),就会优先匹配这个规则,导致后面的带room_identifier的规则不生效,返回404。确保这个规则放在不会被提前匹配的位置。请求方法错误:
虽然这会返回405(方法不允许)而不是404,但还是要确认你发送的是DELETE请求,因为你的视图只实现了delete方法,如果用GET/POST请求这个URL,会返回方法不允许,有时候可能被误判为404,记得检查请求方法是否正确。
可以先从检查请求的完整URL和room_identifier格式入手,这两个是最常见的原因~
内容的提问来源于stack exchange,提问作者ArminMz

