Django Rest framework認證組件詳細用法
本文詳細講述了DRF認證組件的原理以及用法.
源碼剖析
講解DRF版本的時候我們都知道了,在dispatch方法里執(zhí)行了initial方法來初始化我們的版本.
而在initial方法里有我們的認證、權(quán)限、頻率組件,如下圖:

我們再點進去認證組件看看:

可以看到,我們的權(quán)限組件返回的是request.user,那么這里返回的request是新的還是舊的呢?
initial方法是在request重新賦值之后執(zhí)行的,所以我們這里的request是新的——也就是Request類的實例化對象.
所以,這個user一定是一個靜態(tài)方法,我們進去看看:


我沒在這里反復(fù)的截圖跳轉(zhuǎn)頁面,大家可以嘗試著自己去找.
通過上面的分析,我們基本可以知道我們的認證類一定要實現(xiàn)的方法、返回值的類型,以及視圖中要配置的參數(shù):
authentication_classes = ["認證組件類", ]
如果需要全局驗證,則在配置文件中加上此配置:
REST_FRAMEWORK = {
# 配置全局認證
'DEFAULT_AUTHENTICATION_CLASSES': ["blog.auth.MyAuth", ],
}
認證組件的詳細用法
第一步 準(zhǔn)備數(shù)據(jù)庫文件和數(shù)據(jù)
# 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)
數(shù)據(jù)如下:
mysql> select * from blog_userinfo; +----+-----------+-----------+-------+ | id | name | pwd | token | +----+-----------+-----------+-------+ | 1 | 花千骨 | huaqiangu | | +----+-----------+-----------+-------+ 1 row in set (0.00 sec)
第二步 自定義一個認證類
from rest_framework.authentication import BaseAuthentication # > 導(dǎo)入認證類
from rest_framework.exceptions import AuthenticationFailed # 用于拋出錯誤信息
from .models import UserInfo # 導(dǎo)入用戶信息表
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在數(shù)據(jù)庫中是否存在
if not user_obj:
raise AuthenticationFailed("token不存在")
# 5. 認證通過
return (user_obj.name, user_obj)
# 注意,權(quán)限組件會用到這兩個返回值
第三步 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 # 導(dǎo)入自定義的認證組件
from .models import UserInfo # 導(dǎo)入用戶信息表
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:

成功提交數(shù)據(jù)后,將生成并返回UUID:

然后,復(fù)制UUID,去測試認證:

如果我們不指定token:

或者指定錯誤的、不存在的token,都將被拋出錯誤.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用Python批量壓縮png方法實例(支持過濾個別文件與文件夾)
這篇文章主要給大家介紹了關(guān)于利用Python批量壓縮png的相關(guān)資料,文中介紹的方法支持過濾個別文件與文件夾,文中通過示例代碼介紹的非常詳細,需要的朋友們下面跟著小編來一起看看吧。2017-07-07
python opencv實現(xiàn)目標(biāo)區(qū)域裁剪功能
這篇文章主要介紹了python opencv實現(xiàn)目標(biāo)區(qū)域裁剪功能,通過截取到坐標(biāo)信息以后用CV2的裁剪就可以完美實現(xiàn),本文給大家分享實例代碼,需要的朋友可以參考下2021-07-07
Python利用socket實現(xiàn)多進程的端口掃描器
作為開發(fā)人員經(jīng)常需要查看服務(wù)的端口開啟狀態(tài)判斷服務(wù)是否宕機。特別是部署的服務(wù)比較多的情況下,可能存在幾個甚至幾十個服務(wù)端口的占用。所以本文將利用socket實現(xiàn)多進程的端口掃描器,需要的可以參考一下2022-12-12
Python pass語句作用和Python assert斷言函數(shù)的用法
這篇文章主要介紹了Python pass語句作用和Python assert斷言函數(shù)的用法,文章內(nèi)容介紹詳細具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03
python base64 decode incorrect padding錯誤解決方法
這篇文章主要介紹了python base64 decode incorrect padding錯誤解決方法,本文使用把string補齊等號的方法解決了這個錯誤,需要的朋友可以參考下2015-01-01
python數(shù)學(xué)建模(SciPy+?Numpy+Pandas)
這篇文章主要介紹了python數(shù)學(xué)建模(SciPy+?Numpy+Pandas),文章基于python的相關(guān)資料緊接上一篇文章內(nèi)容展開主題詳情,需要的小伙伴可以參考一下2022-07-07

