Django DRF中使用PUT方法更新用户资料出现403错误求助
Django DRF 用户资料编辑PUT接口403错误排查方案
1. 权限类配置检查
- 确认视图类是否配置了正确的权限规则:
- 基础要求需包含
IsAuthenticated确保仅登录用户可访问;若限制用户仅能编辑自身资料,需搭配自定义权限类(如IsOwnerOrReadOnly) - 示例代码:
from rest_framework.permissions import IsAuthenticated from .permissions import IsOwnerOrReadOnly class UserViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]
- 基础要求需包含
- 排查是否误用只读视图类:若使用
ReadOnlyModelViewSet会限制PUT等写操作,需替换为ModelViewSet
2. Token认证有效性验证
- 检查请求头格式:必须为
Authorization: Bearer <access_token>,注意Bearer与token间的空格不可省略 - 验证token有效性:若使用
django-rest-framework-simplejwt,可通过命令校验:python manage.py inspecttoken <你的access_token> - 确认项目配置的认证类正确:
# settings.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], }
3. 自定义权限逻辑校验
若存在自定义权限类IsOwnerOrReadOnly,检查has_object_permission方法逻辑:
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): def has_object_permission(self, request, view, obj): # 只读方法允许所有登录用户访问 if request.method in permissions.SAFE_METHODS: return True # 写操作仅允许用户修改自身资料 return obj == request.user # 若为自定义用户模型,需确认关联字段是否正确,如obj.user == request.user
4. 路由与视图映射检查
- 确认
/users/users/<user_id>/对应的视图支持PUT方法:需绑定ModelViewSet的update方法,而非自定义只读视图 - 校验请求的
user_id是否与当前登录用户ID一致:若尝试修改他人资料触发403为正常权限控制,若修改自身仍报错则需排查权限逻辑
5. 序列化器与模型字段检查
- 排查序列化器是否将需修改的字段设为只读:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username', 'email', 'profile'] read_only_fields = ['id'] # 确保需修改字段未被加入此列表 - 检查迁移文件是否误操作用户模型权限:确认初始化兴趣的迁移未修改用户模型的可编辑字段权限
内容的提问来源于stack exchange,提问作者coals
相关产品推荐
相关产品推荐

