1. 程式人生 > >DjangoRestFramework之認證組件,權限組件,頻率組件

DjangoRestFramework之認證組件,權限組件,頻率組件

pes authent 寫到 必須 user max font alt ews

一 . 認證組件

我們現在知道的認證機制有cookie, session,session比較安全,session的信息是存在服務器上的,
如果用戶量足夠大的話,服務器的壓力也就比較大,並且django的session存到了django_session表中,不是很好操作,現在生產中使用的一個叫做token機制的方式比較多.
可以使用這個機制把token存到用戶信息裏,當用戶登錄成功的時候放裏面,等他來的時候就要帶著這個來,而且們每次來的時候都更新token,防止被攔截.

  我們這裏使用一下token,首先要建一個表,和user表一對一關系

  models.py

class User(models.Model):
    username 
= models.CharField(max_length=16) password = models.CharField(max_length=16) types = ((1, VIP), (2, SVIP), (3, SSVIP)) usertype = models.IntegerField(choices=types, default=1) class UserToken(models.Model): user = models.OneToOneField(User) token = models.CharField(max_length=64)

  URL

url(r^login/$, views.LoginView.as_view()),  # 別忘了$符號結尾

  視圖函數,每次登錄後自動刷新token

import uuid

# 用戶登錄認證
class UserAuth(APIView):
    RET = {
        code: None,
        userinfo: None,
        msg: None,
        token: None
    }

    def post(self, request):
        username 
= request.data.get(username) password = request.data.get(password) user_obj = models.User.objects.filter(username=username, password=password).first() if user_obj: random_str = uuid.uuid4() models.UserToken.objects.update_or_create( # 有就更新,沒有就創建 user=user_obj, defaults={ token: random_str, } ) self.RET[code] = 0 # 跟前端約定好,0表示成功 self.RET[userinfo] = username self.RET[msg] = success self.RET[token] = random_str else: self.RET[code] = -1 self.RET[userinfo] = username self.RET[msg] = failure return Response(self.RET)

  我們這裏寫一下DRF的認證組件

from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
from app01 import models

# drf提供認證失敗的異常
class UserAuthToken(BaseAuthentication):

    # authenticate方法是固定的,並且必須寫這個名字,是request新對象
    def authenticate(self, request):
        token = request.query_params.get(token)  # 類似於GET.get(‘token‘)
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user, token   # 要麽就返回兩個值,要麽就不返回
        else:
            return AuthenticationFailed(認證失敗)  

  我們需要把這個認證組件 寫到每一個url對應的視圖函數中,加上認證,有token就可以訪問,沒有就拒絕

class BookHandle(APIView):
    authentication_classes = [UserAuthToken, ]  #一進到這個函數就進行驗證,變量名必須是這個,認證組件需要從所在文件中導入

    # 獲取所有數據
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

  需要補兩張成功與失敗的對比圖!!!

  全局視圖組件(寫在settings.py中)

  技術分享圖片

二 . 權限組件

  權限組件

from rest_framework.permissions import BasePermission
class UserPermission(BasePermission):
    message = "SVIP才能訪問!"  # 變量只能叫做message,權限不夠的話返回message裏面的數據

    def has_permission(self, request, view):  # view是用權限的視圖函數
        if request.user.usertype == 3:   # user表中usertype的字段表示權限級別
            return True  # 通過權限,只能寫True或False
        return False  # 沒有通過

  視圖函數

class BookHandle(APIView):
    permission_classes = [UserPer, ]  # 一進函數就驗證,只有有權限的才能訪問下面的數據
    # 獲取所有數據
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

  全局視圖權限(寫在settings.py文件)

技術分享圖片

三 . 頻率組件

  內置的throttles類

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):

    scope="visit_rate"   # 限制訪問次數用的
    def get_cache_key(self, request, view):   # 這個方法是固定的

        return self.get_ident(request)

  視圖函數

class BookHandle(APIView):

    throttle_classes = [VisitThrottle, ]  # 添加訪問頻率,需要從該類所在位置引入

    # 獲取所有數據
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

技術分享圖片

DjangoRestFramework之認證組件,權限組件,頻率組件