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

Django REST Framework问题:URL查询参数设置与Redis缓存API 404排查

嘿,我来帮你搞定这两个DRF相关的问题!

1. 如何在Django REST Framework的URL中设置查询参数

其实查询参数(就是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那样。


2. 解决Redis缓存删除API的HTTP 404错误

看了你提供的代码,我帮你梳理几个可能导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:05:57