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和视图代码:
- 修改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参数传给视图。
- 调整视图代码,接收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参数,同时调整路由:
- 修改urls.py,去掉URL中的参数:
# urls.py path('users/delete/', UserDeleteView.as_view(), name='delete-user'),
- 调整视图代码,从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
相关产品推荐
相关产品推荐

