亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django contrib auth authenticate函數源碼解析

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

引言

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

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

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

authenticate函數分析

源碼:

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函數接受的參數,這是指authenticate函數只接受關鍵字傳參,位置傳參是不允許的。因此在使用authenticate函數的時候注意不要為了省事而位置傳參。

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

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

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

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}

應用場景

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

假設有三種角色,角色1使用用戶名登錄,角色2使用手機登錄,角色3使用手機或者郵箱登錄,那么如何通過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,因為其余參數都設置了默認參數,如果確實需要,則之前的參數使用位置傳參。

signal

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 查看django版本的方法分享

    查看django版本的方法分享

    今天小編就為大家分享一篇查看django版本的方法分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python字符串連接的N種方式總結

    python字符串連接的N種方式總結

    python中有很多字符串連接方式,今天在寫代碼,順便總結一下,從最原始的字符串連接方式到字符串列表連接,大家感受下
    2014-09-09
  • 利用python檢查磁盤空間使用情況的代碼實現

    利用python檢查磁盤空間使用情況的代碼實現

    本文將向讀者展示如何利用Python編寫自動化腳本,以檢查磁盤空間使用情況,無論你是經驗豐富的系統(tǒng)管理員,還是對Python自動化充滿興趣的開發(fā)者,本文都將為你提供實用的腳本示例和詳細的解析步驟,幫助你快速掌握磁盤空間監(jiān)控的自動化方法,需要的朋友可以參考下
    2024-08-08
  • python實現二次元圖片展示(屏保)

    python實現二次元圖片展示(屏保)

    這篇文章主要介紹了python實現二次元圖片展示,用了API端口相關的知識實現,下面詳細的文章內容需要的小伙伴可以參考一下
    2022-02-02
  • freeswitch開源通信 python模塊介紹

    freeswitch開源通信 python模塊介紹

    freeswitch支持多種語言的業(yè)務開發(fā),包括C/C++,java,python,js,lua,Golang等等。freeswitch在使用python做業(yè)務開發(fā)時,有倆種接入方式,一種是ESL接口,另一種是mod_python模塊。本文主要介紹的是fs內部的mod_python語言支持模塊,需要的朋友可以參考下面文章內容
    2021-09-09
  • Python批量提取PDF文件中文本的腳本

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

    這篇文章主要為大家詳細介紹了Python批量提取PDF文件中文本的腳本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 解決python刪除文件的權限錯誤問題

    解決python刪除文件的權限錯誤問題

    下面小編就為大家分享一篇解決python刪除文件的權限錯誤問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • PyQT5 emit 和 connect的用法詳解

    PyQT5 emit 和 connect的用法詳解

    今天小編就為大家分享一篇PyQT5 emit 和 connect的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python 元組操作總結

    Python 元組操作總結

    這篇文章主要介紹了Python 元組操作總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Django模塊學習之模塊語言詳解

    Django模塊學習之模塊語言詳解

    模板語言渲染的整個過程其實就是將html轉換成函數,并為該函數提供全局變量,然后執(zhí)行該函數,下面這篇文章主要給大家介紹了關于Django模塊學習之模塊語言的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論