【DRF認證】Python中第三方庫rest_framework的用法
阿新 • • 發佈:2018-12-22
本文詳細講述了DRF認證元件的原理以及用法.
原始碼剖析
上一篇部落格講解DRF版本的時候我們都知道了,在dispatch
方法裡執行了initial
方法來初始化我們的版本.
而在initial
方法裡有我們的認證、許可權、頻率元件,如下圖:
我們再點進去認證元件看看:
可以看到,我們的許可權元件返回的是request.user
,那麼這裡返回的request
是新的還是舊的呢?
initial
方法是在request
重新賦值之後執行的,所以我們這裡的request
是新的——也就是Request
類的例項化物件.
所以,這個user
一定是一個靜態方法,我們進去看看:
我沒在這裡反覆的截圖跳轉頁面,大家可以嘗試著自己去找.
通過上面的分析,我們基本可以知道我們的認證類一定要實現的方法、返回值的型別,以及檢視中要配置的引數:authentication_classes = ["認證元件類", ]
認證元件的詳細用法
第一步 準備資料庫檔案和資料
·# models.py from django.db import models class UserInfo(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) token = models.UUIDField(
null=True, blank=True)資料如下:
mysql> select * from blog_userinfo; +----+-----------+-----------+-------+ | id | name | pwd | token | +----+-----------+-----------+-------+ | 1 | 花千骨 | huaqiangu | | +----+-----------+-----------+-------+ 1 row in set (0.00 sec)
第二步 自定義一個認證類
from
rest_framework.authentication import BaseAuthentication # > 匯入認證類 from rest_framework.exceptions import AuthenticationFailed # 導> 入用於丟擲錯誤資訊的類 from .models import UserInfo # 匯入使用者資訊表 class MyAuth(BaseAuthentication): def authenticate(self, request): """自定義的認證類中必須有此方法以及如下的判斷和兩個返回值""" # 1. 獲取token token = request.query_params.get('token') # 2. 判斷是否成功獲取token if not token: raise AuthenticationFailed("缺少token") # 3. 判斷token是否合法 try: user_obj = UserInfo.objects.filter(token=token).first() except Exception: raise AuthenticationFailed("token不合法") # 4. 判斷token在資料庫中是否存在 if not user_obj: raise AuthenticationFailed("token不存在") # 5. 認證通過 return (user_obj, token)
**第三步
urls.py
from django.conf.urls import url from blog.views import LoginView, TestAuthView urlpatterns = [ url(r'^login/$', LoginView.as_view()), # 用於登陸 url(r'^test/$', TestAuthView.as_view()), # 用於認證測試 ]
**第四步
views.py
from rest_framework.views import APIView from rest_framework.response import Response from .auth import MyAuth # 匯入自定義的認證元件 from .models import UserInfo # 匯入使用者資訊表 import uuid # 用於生成uuid class LoginView(APIView): """用於登陸驗證並生成UUID的檢視""" def post(self, request): name = request.data.get('name') pwd = request.data.get('pwd') user_obj = UserInfo.objects.filter(name=name, pwd=pwd).first() if user_obj: u4 = uuid.uuid4() # 生成uuid4 user_obj.token = u4 user_obj.save() return Response(u4) return Response("使用者名稱或密碼錯誤") class TestAuthView(APIView): """用於認證測試的檢視""" # 在檢視中增加此配置,即表明此檢視要走認證邏輯認證 # 認證元件可以寫多個 authentication_classes = [MyAuth, ] def get(self, request): return Response("認證測試")
好了,我們來測試吧.
首先,登陸並生成UUID:
成功提交資料後,將生成並將返回UUID:
然後,複製UUID,去測試認證:
如果我們不指定token:
或者指定錯誤的、不存在的token,都將被丟擲錯誤.
is ok.