Restframework 認證authentication 組件實例-1


 

1. 創建用戶表和 token表

class User(models.Model):
    user =models.CharField(max_length=32)
    pwd =models.CharField(max_length=32)
    type=((1,"VIP"),(2,"SVIP"),(1,"SSVIP"))
    user_type = models.IntegerField(choices=type)


class UserToken(models.Model):
    user= models.OneToOneField("User")
    token =models.CharField(max_length=128)

 

2.創建登錄類

from app01.models import User,UserToken

class LoginView(APIView):
    """
    1000:成功
    1001: 用戶名和密碼錯誤
    1002:異常錯誤
    """
    def post(self,request):
        response = {"code": 100, "msg": None, "user": None}
        try:
            print(request.data)
            user= request.data.get("user")
            pwd =request.data.get("pwd")

            user =User.objects.filter(user=user,pwd=pwd).first()

            import uuid
            random_str =uuid.uuid4()

            if user:
                response["user"] =user.user
                UserToken.objects.update_or_create(user =user,defaults={"token":random_str})
                response["user"] =user.user
                response["token"] =random_str
            else:
                response["code"]=1001
                response["msg"]="密碼錯誤"

        except Exception as e:
             response["code"] =1002
             response["msg"] =str(e)

        return Response(response)

 

3.設置認證類邏輯.

from app01.models import UserToken
from rest_framework.exceptions import AuthenticationFailed

from rest_framework.authentication import BaseAuthentication

class UserAuth(BaseAuthentication):

 msg = "認證失敗"     def authenticate(self, request):
        token = request.query_params.get("token")
        usertoken= UserToken.objects.filter(token =token).first()

        if usertoken:
            return  usertoken.user, usertoken.token
        else:
            raise  AuthenticationFailed("認證失敗!")

 

4.1 應用局部認證 

class BookView(APIView):
 authentication_classes = [UserAuth] 
    def get(self,request):
        """
        查看所有書籍
        :param request:
        :return:
        """
        book_list=Book.objects.all()
        serializer= BookSerializer(book_list,many=True)
        return Response(serializer.data)

    def post(self,request):
        """
        添加一條書籍
        :param request:
        :return:
        """
        serializer=BookSerializer(data=request.data,many=True)
        if serializer.is_valid():
            serializer.save()#create操作.
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

  

4.2 設置全局認證模式 

REST_FRAMEWORK={

'DEFAULT_AUTHENTICATION_CLASSES': (
  'app01.utils.auth_class.UserAuth',
),

}

 

驗證.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM