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

Django contrib auth authenticate函數(shù)源碼解析

 更新時間:2020年11月12日 14:47:10   作者:codeLeaves  
這篇文章主要介紹了Django contrib auth authenticate函數(shù)源碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

引言

django提供了一個默認(rèn)的auth系統(tǒng)用于用戶的登錄和授權(quán),并提供了一定的擴(kuò)展性,允許開發(fā)者自行定義多個驗證后臺,每個驗證后臺必須實現(xiàn)authenticate函數(shù),并返回None或者User對象。

默認(rèn)的后臺是django.contrib.auth.backends.ModelBackend,該后臺通過用戶名和密碼進(jìn)行用戶的驗證,以settings.AUTH_USER_MODEL作為模型。但是在實際的開發(fā)中,相信大家都不會固定的使用用戶名以及同一個model進(jìn)行驗證,比如,不同的角色需要不同的model作為驗證的數(shù)據(jù)源,有的角色是使用手機(jī)登錄,而有的角色使用郵箱登錄。

那么,當(dāng)存在多個驗證后臺的時候,django是如何制作一個統(tǒng)一的接口進(jìn)行不同后臺的驗證呢?

authenticate函數(shù)分析

源碼:

def authenticate(**credentials):
  """
  If the given credentials are valid, return a User object.
  """
  for backend, backend_path in _get_backends(return_tuples=True):
    try:
      inspect.getcallargs(backend.authenticate, **credentials)
    except TypeError:
      # This backend doesn't accept these credentials as arguments. Try the next one.
      continue

    try:
      user = backend.authenticate(**credentials)
    except PermissionDenied:
      # This backend says to stop in our tracks - this user should not be allowed in at all.
      break
    if user is None:
      continue
    # Annotate the user object with the path of the backend.
    user.backend = backend_path
    return user

  # The credentials supplied are invalid to all backends, fire signal
  user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials))

**credentials

首先可以看到authenticate函數(shù)接受的參數(shù),這是指authenticate函數(shù)只接受關(guān)鍵字傳參,位置傳參是不允許的。因此在使用authenticate函數(shù)的時候注意不要為了省事而位置傳參。

# This will fail
user = authenticate('username', 'password')

# This will success
user = authenticate(username='username', password='password')

inspect.getcallargs(func, *args, **kwargs)
inspect模塊是Python官方的標(biāo)準(zhǔn)模塊,這個模塊對Python的自省功能進(jìn)行一定的封裝。其中inspect.getcallargs檢查args和kwargs這些參數(shù)是否能被func要求的參數(shù)匹配,若匹配成功返回參數(shù)字典,如果不能匹配就會raise TypeError。
舉個簡單的例子。假設(shè)在Python中定義這樣一個函數(shù):

import inspect
def test_func(arg1, arg2, *args, **kwargs):
  pass
# this will raise TypeError
inspect.getcallargs(test_func, a=1, b=2, c=3)
# TypeError: test_func() missing 2 required positional arguments: 'arg1' and 'arg2'

# this will ok
inspect.getcallargs(test_func, 1, 2, 3, a=1, b=2, c=3)
# {'kwargs': {'b': 2, 'c': 3, 'a': 1}, 'arg2': 2, 'args': (3,), 'arg1': 1}

應(yīng)用場景

通過inspect.getcallargs的參數(shù)過濾功能,只要設(shè)置不同后臺的authenticate的函數(shù)參數(shù),就能在第一步實現(xiàn)不同角色的后臺選擇。

假設(shè)有三種角色,角色1使用用戶名登錄,角色2使用手機(jī)登錄,角色3使用手機(jī)或者郵箱登錄,那么如何通過inspect.getcallargs就選擇合適的backend.authenticate呢?

def role3_authenticate(role3_phone=None, role3_email=None, password=None):
  print("role1 authentication.")

def role2_authenticate(role2_phone=None, password=None):
  print("role2 authenticate.")

def role1_authenticate(role1_name=None, password=None):
  print("role2 authenticate.")

methods = [role1_authenticate, role2_authenticate, role3_authenticate]
def authenticate(**credentials):
  for backend in methods:
    try:
      inspect.getcallargs(backend, **credentials)
    except TypeError:
      print("error")
      continue

    backend(**credentials)
    print("end")
    break

如果加入**kwargs則每個authenticate都不會引發(fā)TypeError,因為其余參數(shù)都設(shè)置了默認(rèn)參數(shù),如果確實需要,則之前的參數(shù)使用位置傳參。

signal

若用戶沒有成功登陸,則authenticate發(fā)送了一個用戶沒有成功登陸的信號,開發(fā)者可以自行定義接受這個信號的recevier。關(guān)于django signal筆者之后還會詳細(xì)談及。

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

相關(guān)文章

  • PyTorch中torch.nn.Linear實例詳解

    PyTorch中torch.nn.Linear實例詳解

    torch.nn是包含了構(gòu)筑神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)基本元素的包,在這個包中可以找到任意的神經(jīng)網(wǎng)絡(luò)層,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.nn.Linear的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • matplotlib命令與格式之tick坐標(biāo)軸日期格式(設(shè)置日期主副刻度)

    matplotlib命令與格式之tick坐標(biāo)軸日期格式(設(shè)置日期主副刻度)

    這篇文章主要介紹了matplotlib命令與格式之tick坐標(biāo)軸日期格式(設(shè)置日期主副刻度),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對CIFAR10圖片進(jìn)行分類方式

    Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對CIFAR10圖片進(jìn)行分類方式

    這篇文章主要介紹了Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對CIFAR10圖片進(jìn)行分類方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python中for循環(huán)把字符串或者字典添加到列表的方法

    python中for循環(huán)把字符串或者字典添加到列表的方法

    今天小編就為大家分享一篇python中for循環(huán)把字符串或者字典添加到列表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python批量提取PDF文件中文本的腳本

    Python批量提取PDF文件中文本的腳本

    這篇文章主要為大家詳細(xì)介紹了Python批量提取PDF文件中文本的腳本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細(xì)使用方法與實例

    python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細(xì)使用方法與實例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細(xì)使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • Python中的Dataset和Dataloader詳解

    Python中的Dataset和Dataloader詳解

    這篇文章主要介紹了Python中的Dataset和Dataloader詳解,DataLoader與DataSet是PyTorch數(shù)據(jù)讀取的核心,是構(gòu)建一個可迭代的數(shù)據(jù)裝載器,每次執(zhí)行循環(huán)的時候,就從中讀取一批Batchsize大小的樣本進(jìn)行訓(xùn)練,需要的朋友可以參考下
    2023-07-07
  • python進(jìn)行圖像邊緣檢測的詳細(xì)教程

    python進(jìn)行圖像邊緣檢測的詳細(xì)教程

    相信大家對于邊緣檢測這幾個詞并不陌生,但是相對于如何處理,如何進(jìn)行圖像的邊緣檢測卻無能為力、束手無策了,下面這篇文章主要給大家介紹了關(guān)于python進(jìn)行圖像邊緣檢測的詳細(xì)教程,需要的朋友可以參考下
    2023-04-04
  • python用Configobj模塊讀取配置文件

    python用Configobj模塊讀取配置文件

    這篇文章主要介紹了python用Configobj模塊讀取配置文件,幫助大家更好的利用python處理文件,感興趣的朋友可以了解下
    2020-09-09
  • pygraphviz安裝教程

    pygraphviz安裝教程

    Graphviz 是一款由 AT&T Research 和 Lucent Bell 實驗室開源的可視化圖形工具,可以很方便的用來繪制結(jié)構(gòu)化的圖形網(wǎng)絡(luò),支持多種格式輸出,這篇文章主要介紹了pygraphviz安裝教程,需要的朋友可以參考下
    2023-02-02

最新評論

防城港市| 通州市| 台北县| 南投县| 云林县| 宝丰县| 日照市| 峡江县| 津市市| 启东市| 界首市| 新巴尔虎右旗| 林周县| 赞皇县| 大渡口区| 巫溪县| 阿拉尔市| 长沙市| 桃园县| 山东| 望江县| 隆昌县| 开平市| 屯昌县| 来凤县| 静宁县| 鄯善县| 安吉县| 南召县| 西安市| 滨州市| 永嘉县| 安塞县| 涡阳县| 延边| 石柱| 获嘉县| 绥化市| 太康县| 定边县| 阿拉善左旗|