最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django Rest framework認(rèn)證組件詳細(xì)用法

 更新時(shí)間:2019年07月25日 15:07:52   作者:Title  
這篇文章主要介紹了Django Rest framework認(rèn)證組件詳細(xì)用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

本文詳細(xì)講述了DRF認(rèn)證組件的原理以及用法.

源碼剖析

講解DRF版本的時(shí)候我們都知道了,在dispatch方法里執(zhí)行了initial方法來(lái)初始化我們的版本.

而在initial方法里有我們的認(rèn)證、權(quán)限、頻率組件,如下圖:


我們?cè)冱c(diǎn)進(jìn)去認(rèn)證組件看看:


可以看到,我們的權(quán)限組件返回的是request.user,那么這里返回的request是新的還是舊的呢?

initial方法是在request重新賦值之后執(zhí)行的,所以我們這里的request是新的——也就是Request類的實(shí)例化對(duì)象.

所以,這個(gè)user一定是一個(gè)靜態(tài)方法,我們進(jìn)去看看:



我沒(méi)在這里反復(fù)的截圖跳轉(zhuǎn)頁(yè)面,大家可以嘗試著自己去找.

通過(guò)上面的分析,我們基本可以知道我們的認(rèn)證類一定要實(shí)現(xiàn)的方法、返回值的類型,以及視圖中要配置的參數(shù):

authentication_classes = ["認(rèn)證組件類", ]

如果需要全局驗(yàn)證,則在配置文件中加上此配置:

REST_FRAMEWORK = {
  # 配置全局認(rèn)證
  'DEFAULT_AUTHENTICATION_CLASSES': ["blog.auth.MyAuth", ],
}

認(rèn)證組件的詳細(xì)用法

第一步 準(zhǔn)備數(shù)據(jù)庫(kù)文件和數(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)

第二步 自定義一個(gè)認(rèn)證類

from rest_framework.authentication import BaseAuthentication # > 導(dǎo)入認(rèn)證類
from rest_framework.exceptions import AuthenticationFailed # 用于拋出錯(cuò)誤信息
from .models import UserInfo # 導(dǎo)入用戶信息表


class MyAuth(BaseAuthentication):
  def authenticate(self, request):
    """自定義的認(rèn)證類中必須有此方法以及如下的判斷和兩個(gè)返回值"""

    # 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ù)庫(kù)中是否存在
    if not user_obj:
      raise AuthenticationFailed("token不存在")

    # 5. 認(rèn)證通過(guò)
    return (user_obj.name, user_obj)
    # 注意,權(quán)限組件會(huì)用到這兩個(gè)返回值

第三步 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()), # 用于認(rèn)證測(cè)試
]

第四步 views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 導(dǎo)入自定義的認(rèn)證組件
from .models import UserInfo # 導(dǎo)入用戶信息表
import uuid # 用于生成uuid


class LoginView(APIView):
  """用于登陸驗(yàn)證并生成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("用戶名或密碼錯(cuò)誤")


class TestAuthView(APIView):
  """用于認(rèn)證測(cè)試的視圖"""
  
  # 在視圖中增加此配置,即表明此視圖要走認(rèn)證邏輯認(rèn)證
  # 認(rèn)證組件可以寫多個(gè)
  authentication_classes = [MyAuth, ]

  def get(self, request):
    return Response("認(rèn)證測(cè)試")

好了,我們來(lái)測(cè)試吧.

首先,登陸并生成UUID:

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

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

如果我們不指定token:

或者指定錯(cuò)誤的、不存在的token,都將被拋出錯(cuò)誤.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)識(shí)別圖片和掃描PDF中的文字

    Python實(shí)現(xiàn)識(shí)別圖片和掃描PDF中的文字

    在處理掃描的PDF和圖片時(shí),文字信息往往無(wú)法直接編輯、搜索或復(fù)制,這給信息提取和分析帶來(lái)了諸多不便,所以本文將介紹如何使用Python及相關(guān)OCR庫(kù)實(shí)現(xiàn)對(duì)圖片和掃描PDF中文字的識(shí)別,需要的可以了解下
    2025-02-02
  • 利用Python批量壓縮png方法實(shí)例(支持過(guò)濾個(gè)別文件與文件夾)

    利用Python批量壓縮png方法實(shí)例(支持過(guò)濾個(gè)別文件與文件夾)

    這篇文章主要給大家介紹了關(guān)于利用Python批量壓縮png的相關(guān)資料,文中介紹的方法支持過(guò)濾個(gè)別文件與文件夾,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-07-07
  • python opencv實(shí)現(xiàn)目標(biāo)區(qū)域裁剪功能

    python opencv實(shí)現(xiàn)目標(biāo)區(qū)域裁剪功能

    這篇文章主要介紹了python opencv實(shí)現(xiàn)目標(biāo)區(qū)域裁剪功能,通過(guò)截取到坐標(biāo)信息以后用CV2的裁剪就可以完美實(shí)現(xiàn),本文給大家分享實(shí)例代碼,需要的朋友可以參考下
    2021-07-07
  • python進(jìn)階之魔術(shù)方法詳解

    python進(jìn)階之魔術(shù)方法詳解

    這篇文章主要為大家介紹了python進(jìn)階之魔術(shù)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 解決Python 寫文件報(bào)錯(cuò)TypeError的問(wèn)題

    解決Python 寫文件報(bào)錯(cuò)TypeError的問(wèn)題

    這篇文章主要介紹了解決Python 寫文件報(bào)錯(cuò)TypeError的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    作為開(kāi)發(fā)人員經(jīng)常需要查看服務(wù)的端口開(kāi)啟狀態(tài)判斷服務(wù)是否宕機(jī)。特別是部署的服務(wù)比較多的情況下,可能存在幾個(gè)甚至幾十個(gè)服務(wù)端口的占用。所以本文將利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器,需要的可以參考一下
    2022-12-12
  • Python pass語(yǔ)句作用和Python assert斷言函數(shù)的用法

    Python pass語(yǔ)句作用和Python assert斷言函數(shù)的用法

    這篇文章主要介紹了Python pass語(yǔ)句作用和Python assert斷言函數(shù)的用法,文章內(nèi)容介紹詳細(xì)具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • python base64 decode incorrect padding錯(cuò)誤解決方法

    python base64 decode incorrect padding錯(cuò)誤解決方法

    這篇文章主要介紹了python base64 decode incorrect padding錯(cuò)誤解決方法,本文使用把string補(bǔ)齊等號(hào)的方法解決了這個(gè)錯(cuò)誤,需要的朋友可以參考下
    2015-01-01
  • python-docx文件路徑問(wèn)題的解決方案

    python-docx文件路徑問(wèn)題的解決方案

    這篇文章主要介紹了python-docx文件路徑問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • python數(shù)學(xué)建模(SciPy+?Numpy+Pandas)

    python數(shù)學(xué)建模(SciPy+?Numpy+Pandas)

    這篇文章主要介紹了python數(shù)學(xué)建模(SciPy+?Numpy+Pandas),文章基于python的相關(guān)資料緊接上一篇文章內(nèi)容展開(kāi)主題詳情,需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

含山县| 辽阳县| 砀山县| 清水县| 韶关市| 泾阳县| 陵水| 苍南县| 龙海市| 当涂县| 蒙山县| 兴业县| 长泰县| 合阳县| 垦利县| 滦南县| 筠连县| 兰溪市| 防城港市| 新安县| 互助| 奉节县| 乌拉特前旗| 宁国市| 子长县| 湾仔区| 黎平县| 特克斯县| 石河子市| 博爱县| 弋阳县| 竹山县| 泸州市| 银川市| 泾阳县| 澄迈县| 阳东县| 年辖:市辖区| 舒兰市| 建昌县| 深州市|