欢迎光临
我们一直在努力

什么是动态DRF08-个人中心功能开发

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
from rest_framework import mixins
from rest_framework.mixins import CreateModelMixin
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from rest_framework import permissions
from rest_framework import authentication
from random import choice
from rest_framework_jwt.serializers import jwt_encode_handler,jwt_payload_handler#这两步是生成token关键源码
from rest_framework_jwt.authentication import JSONWebTokenAuthentication

from utils.yunpian import YunPian
from MxShop.settings import APIKEY
from .serializers import SmsSerializer,UserRegisterSerializer,UserDetailSerializer
from .models import VerifyCode

User = get_user_model()

class UserViewset(CreateModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    """
    用户
    """
    serializer_class = UserRegisterSerializer
    queryset = User.objects.all()
    authentication_classes = (authentication.SessionAuthentication,JSONWebTokenAuthentication)
    # permission_classes = (permissions.IsAuthenticated,)

    def get_serializer_class(self):  #动态的加载序列化器
        if self.action == "retrive":
            return UserDetailSerializer
        elif self.action == "create":
            return UserRegisterSerializer
        return UserDetailSerializer
    def get_permissions(self):          #动态加载权限验证(看源码然后重载这个方法)
        if self.action == "retrive":
            return [permissions.IsAuthenticated()]
        elif self.action == "create":
            return []
        return []

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = self.perform_create(serializer)
        # token返回的时候,是返回serializer.data,因此要放在data里边
        re_dict = serializer.data
        payload = jwt_payload_handler(user)
        #要和前端保持一致,前端也叫token
        re_dict["token"] = jwt_encode_handler(payload)
        re_dict["name"] = user.name if user.name else user.username

        headers = self.get_success_headers(serializer.data)
        return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)

    def get_object(self):
        return self.request.user

    #重载上面create中的perform_create方法
    def perform_create(self, serializer):
        return serializer.save()
赞(0)
未经允许不得转载:上海聚慕医疗器械有限公司 » 什么是动态DRF08-个人中心功能开发

登录

找回密码

注册