9.2.动态设置serializer和permission获取用户信息
apps/users/views.py
from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin
from rest_framework import viewsets
from rest_framework import permissions
from users.serializers import UserRegSerializer, UserDetailSerializer
class UserViewSet(CreateModelMixin, RetrieveModelMixin, viewsets.GenericViewSet):
# 动态设置permission
def get_permissions(self):
if self.action == "create":
return []
elif self.action == "retrieve":
return [permissions.IsAuthenticated()]
return []
# 动态设置serializer
def get_serializer_class(self):
if self.action == "create":
return UserRegSerializer
elif self.action == "retrieve":
return UserDetailSerializer
return UserDetailSerializer
# 返回当前用户信息
def get_object(self):
return self.request.user
apps/users/serializers.py
import re
from datetime import datetime
from datetime import timedelta
from django.contrib.auth import get_user_model
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
User = get_user_model()
class UserDetailSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('name', 'birthday', 'gender', 'mobile', 'email')
class UserRegSerializer(serializers.ModelSerializer):
code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4, label="验证码",
error_messages={
"blank": "请输入验证码",
"required": "请输入验证码",
"max_length": "验证码格式错误",
"min_length": "验证码格式错误"
},
help_text='验证码')
username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
validators=[UniqueValidator(queryset=User.objects.all(), message="用户已经存在")])
password = serializers.CharField(style={'input_type': 'password'}, help_text="密码", label="密码", write_only=True)
def validate_code(self, code):
verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")
if verify_records:
last_record = verify_records[0]
five_minutes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
if five_minutes_ago > last_record.add_time:
raise serializers.ValidationError("验证码过期")
if last_record.code != code:
raise serializers.ValidationError("验证码错误")
else:
raise serializers.ValidationError("验证码错误")
def validate(self, attrs):
attrs["mobile"] = attrs["username"]
# attrs["password"] = make_password(attrs["password"])
del attrs["code"]
return attrs
class Meta:
model = User
fields = ('username', 'code', 'mobile', 'password')
Last updated
Was this helpful?