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

Django Rest Framework按token删除用户失败问题求助

问题分析

这个错误提示Expected view to be called with a URL keyword argument named "user_token"很明确——你的视图代码被设计成从URL路径的关键字参数中获取user_token,但你实际是通过请求Body来传递这个参数的,两者不匹配,所以DRF找不到它需要的参数就报错了。

下面根据你的需求提供两种解决方案,你可以根据API设计偏好选择:


方案1:保持通过URL路径传递user_token(推荐RESTful风格)

如果你的API遵循RESTful规范,把标识用户的token放在URL路径里,那需要调整urls.py和视图代码:

  1. 修改urls.py,配置带参数的路由:
# urls.py
from django.urls import path
from .views import UserDeleteView

urlpatterns = [
    # 其他路由...
    path('users/delete/<str:user_token>/', UserDeleteView.as_view(), name='delete-user'),
]

这里的<str:user_token>是告诉Django,把URL中这个位置的字符串作为user_token参数传给视图。

  1. 调整视图代码,接收URL传来的参数:
    如果用自定义APIView:
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User

class UserDeleteView(APIView):
    def delete(self, request, user_token):
        # 根据token查找用户(假设你的User模型有token字段,字段名按实际情况修改)
        try:
            user = User.objects.get(token=user_token)
            user.delete()
            return Response({"msg": "用户删除成功"}, status=status.HTTP_200_OK)
        except User.DoesNotExist:
            return Response({"error": "未找到该用户"}, status=status.HTTP_404_NOT_FOUND)

如果用DestroyAPIView这类通用视图,重写get_object方法来根据user_token获取用户:

# views.py
from rest_framework.generics import DestroyAPIView
from .models import User
from .serializers import UserSerializer

class UserDeleteView(DestroyAPIView):
    serializer_class = UserSerializer

    def get_object(self):
        user_token = self.kwargs.get('user_token')
        return User.objects.get(token=user_token)

Postman测试方式:
选择DELETE方法,URL填写http://你的域名/users/delete/你的用户token/,不需要在Body里传参数。


方案2:改为通过请求Body传递user_token

如果你确实需要从Body里传user_token,那要修改视图不再依赖URL参数,同时调整路由:

  1. 修改urls.py,去掉URL中的参数:
# urls.py
path('users/delete/', UserDeleteView.as_view(), name='delete-user'),
  1. 调整视图代码,从request.data中获取参数:
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User

class UserDeleteView(APIView):
    def delete(self, request):
        user_token = request.data.get('user_token')
        # 先验证参数是否存在
        if not user_token:
            return Response({"error": "请求Body中必须包含user_token参数"}, status=status.HTTP_400_BAD_REQUEST)
        
        try:
            user = User.objects.get(token=user_token)
            user.delete()
            return Response({"msg": "用户删除成功"}, status=status.HTTP_200_OK)
        except User.DoesNotExist:
            return Response({"error": "未找到该用户"}, status=status.HTTP_404_NOT_FOUND)

Postman测试方式:
选择DELETE方法,URL填写http://你的域名/users/delete/,然后在Body里选择form-data或者raw JSON,传入user_token: 你的用户token(JSON格式为{"user_token": "xxx"})。


额外提示

  • 确保你的User模型确实有存储token的字段(比如token = models.CharField(max_length=255, unique=True)),并且查询时的字段名和模型一致。
  • 如果用了序列化器,删除操作通常不需要序列化器处理数据,但如果需要验证token的合法性,可以在视图里先做校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:03:53