国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁/技術文章
文章詳情頁

Django contrib auth authenticate函數源碼解析

瀏覽:99日期:2024-09-18 18:03:54

引言

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

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

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

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 failuser = authenticate(’username’, ’password’)

# This will successuser = authenticate(username=’username’, password=’password’)

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

import inspectdef test_func(arg1, arg2, *args, **kwargs): pass# this will raise TypeErrorinspect.getcallargs(test_func, a=1, b=2, c=3)# TypeError: test_func() missing 2 required positional arguments: ’arg1’ and ’arg2’# this will okinspect.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都不會引發TypeError,因為其余參數都設置了默認參數,如果確實需要,則之前的參數使用位置傳參。

signal

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

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

標簽: Django
相關文章:
主站蜘蛛池模板: 好看的亚洲视频 | 国产成人精品在线观看 | 一级特黄aaa大片在线观看 | 九一国产 | 欧美特级特黄a大片免费 | 免费国产高清精品一区在线 | 国产精品一区二区资源 | 国产高清在线精品免费 | 亚洲永久免费 | 一级片在线免费看 | 国产精品96久久久久久久 | 久草福利资源在线观看 | 午夜福利国产一级毛片 | 国产成人aa在线观看视频 | 成年女人aaaaa毛片 | 在线播放一级片 | 国产成人综合网在线观看 | 日产一区2区三区有限公司 日产一区两区三区 | 欧美高清日韩 | 久久综合中文字幕一区二区 | 精品国产香蕉在线播出 | 毛片免费观看日本中文 | 狠狠综合久久久久综合小说网 | 爽爽日本在线视频免费 | 爱视频福利广场 | 欧美成人免费观看国产 | 天天澡天天碰天天狠伊人五月 | 欧美一级专区免费大片 | 老司机亚洲精品影院 | 深夜国产成人福利在线观看女同 | 一级毛片免费看 | 亚洲成年男人的天堂网 | 日韩美女免费视频 | 国产欧美17694免费观看视频 | 日本免费高清视频二区 | 老头做爰xxxx视频 | 超级乱淫视频aⅴ播放视频 超级碰碰碰在线观看 | 国产三级日产三级日本三级 | 欧美日韩精品一区二区免费看 | 免费观看成人www精品视频在线 | 免费福利入口在线观看 |