- drf 基本的权限认证使用 permission_classes 配置
它会调用内部的 get_permissions() 方法。
最近遇到一个问题,当用户获取自己的权限时,希望用户是登录状态,因此可以配置 permission_classes,但是 restful_api讲究的是对资源的操作,因此在创建用户时候,也应该对用户这一实体进行操作。这样就必须放在同一个 viewset 中。这时如果简单配置 permission_classes 的话,创建用户时就也要登录,不符合常理。所以可以考虑重写 get_permissions() 方法
def get_permissions(self):
# action 属性只有使用 viewset 的时候才存在
if self.action == 'retrieve':
return [permissions.IsAuthenticated()]
elif self.action == 'create':
return []
return []
- 需要多个 serializer
如果一个 viewset 需要多个 serializer,可以重写 get_serializer_class 方法
def get_serializer_class(self):
if self.action == 'retrieve':
return serializer1
elif self.action == 'create':
return serializer2
return serializer2
- 获取当前用户
restful_api 推荐使用这种格式 /users/id,那么可以考虑重写 get_object()
def get_object(self):
return self.request.user
- serializer 的验证
在 serializer 的配置中,有时需要验证某些字段,某些简单的验证可以使用基础的字段来验证,例如验证手机号:
mobile = serializers.CharField(max_length=11, min_length=11, required=True)
如果还有其他的要求可以自定义
# 注意一定要以 validate_<Filed name> 为名称
def validate_mobile(self, mobile):
pass
return mobile
网友评论