DjangoRestFramework之認證組件,權限組件,頻率組件
阿新 • • 發佈:2019-05-03
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之認證組件,權限組件,頻率組件