1. 程式人生 > >【DRF認證】Python中第三方庫rest_framework的用法

【DRF認證】Python中第三方庫rest_framework的用法

本文詳細講述了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.