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

Django Auth應(yīng)用實(shí)現(xiàn)用戶身份認(rèn)證

 更新時(shí)間:2021年12月03日 10:52:23   投稿:newname  
Django Auth 應(yīng)用一般用在用戶的登錄注冊(cè)上,用于判斷當(dāng)前的用戶是否合法。本文將介紹Auth的另一個(gè)功能,即認(rèn)證用戶身份,感興趣的同學(xué)可以關(guān)注一下

我們知道 Django Auth 應(yīng)用一般用在用戶的登錄注冊(cè)上,用于判斷當(dāng)前的用戶是否合法,從而可以幫助開(kāi)發(fā)者快速的構(gòu)建用戶系統(tǒng),那么 Auth 應(yīng)用又是如何是實(shí)現(xiàn)用戶的認(rèn)證的呢?當(dāng)給定相關(guān)的條件或?qū)傩詴r(shí)候,我們可以去獲取用戶對(duì)象這個(gè)過(guò)程就被稱(chēng)為用戶認(rèn)證,Django Auth 應(yīng)用提供了一個(gè)用來(lái)認(rèn)證的方法即 authenticate 方法用來(lái)實(shí)現(xiàn)用戶的認(rèn)證行為。下面就讓我們一起來(lái)認(rèn)識(shí)一下吧!

1. 實(shí)現(xiàn)用戶的認(rèn)證

authenticate 方法一般接受 username 與 password 作為參數(shù),如果通過(guò)了認(rèn)證,就返回認(rèn)證的實(shí)例對(duì)象,否則就會(huì)返回 None,下面我們進(jìn)行一下相關(guān)的實(shí)例演示:

In [1]: from django.contrib.auth import authenticate

In [2]: user=authenticate(username="bookstore",password="python_django")

In [3]: user

Out[3]: <User: bookstore>

In [4]: user=authenticate(username="bookstore",password="python")

In [5]: user is None

Out[5]: True

用戶認(rèn)證過(guò)程解析

上述代碼中,我們首先引入 authenticate ,可知該方法定義在 django/contrib/auth/__init__.py 文件中,然后我們對(duì)上一節(jié)中創(chuàng)建的 user 用戶進(jìn)行可認(rèn)證,輸入它的兩個(gè)參數(shù)值,最后驗(yàn)證通過(guò)返回了 user 的實(shí)例對(duì)象,最后我們更改了密碼的參數(shù)值將其設(shè)置為不正確,并使用 user is None 的方法查看其返回結(jié)果是否為 None,得到的布爾值為 Ture,所以用戶認(rèn)證失敗。這就是用戶認(rèn)證的的過(guò)程。

那么 authenticate 方法是如何實(shí)現(xiàn)的呢?我們分析一下它的源碼:

def authenticate(request=None, **credentials):
    #__get_backends獲取當(dāng)前系統(tǒng)中定義的認(rèn)證后端,并依次迭代
    for backend, backend_path in _get_backends(return_tuples=True):
        try:
            inspect.getcallargs(backend.authenticate, request, **credentials)
        except TypeError:
            #此后端不接受這些憑據(jù)作為參數(shù)。返回繼續(xù)執(zhí)行循環(huán)
            continue
        try:
             #通過(guò)當(dāng)前的認(rèn)證后端嘗試獲取 User,若獲取不到就會(huì)拋出異常!
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            #拋出異常Permission
            break
         #如果沒(méi)有返回,繼續(xù)執(zhí)行下一個(gè)認(rèn)證
        if user is None:
            continue
        #添加一個(gè)屬性標(biāo)志,代表后端認(rèn)證成功
        user.backend = backend_path
        return user
    # 所提供的憑據(jù)對(duì)所有后端、觸發(fā)信號(hào)無(wú)效
    user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)

Django獲取后端認(rèn)證

上述代碼中,我們可以看出,authenticate 方法使用了當(dāng)前系統(tǒng)中定義的認(rèn)證后端來(lái)獲取用戶對(duì)象,當(dāng)前系統(tǒng)的默認(rèn)認(rèn)證后端是 ModelBackend。那么 Django 是如何獲取認(rèn)證后端的呢?如下所示:

def _get_backends(return_tuples=False):
    backends = []
    #AUTHENTICATION_BACKENDS 定義了當(dāng)前系統(tǒng)可以用的身份認(rèn)證列表
    for backend_path in settings.AUTHENTICATION_BACKENDS:
        #加載后端
        backend = load_backend(backend_path)
        backends.append((backend, backend_path) if return_tuples else backend)
    #如果未定義后端列表拋出異常
    if not backends:
        raise ImproperlyConfigured(
            'No authentication backends have been defined. Does '
            'AUTHENTICATION_BACKENDS contain anything?'
        )
    return backends

但是我們并沒(méi)有對(duì) AUTHENTICATION_BACKENDS 進(jìn)行定義,所以這里會(huì)使用戶 Django 框架默認(rèn)的后端認(rèn)認(rèn)證,它位于 django/conf/global_settings.py 文件中,如下所示:

AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']  #當(dāng)前系統(tǒng)默認(rèn)認(rèn)證后端ModelBackend

AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']? #當(dāng)前系統(tǒng)默認(rèn)認(rèn)證后端ModelBackend

2. Auth應(yīng)用獲取用戶模型

get_user_model 用于獲取當(dāng)前系統(tǒng)定義的“用戶模型”。其源代碼如下所示:

def get_user_model():
    """
    返回一個(gè)處于激活狀態(tài)的 User
    """
    try:
        return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    except LookupError:
        raise ImproperlyConfigured(
            "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
        )

get_user_model 使用實(shí)例如下所示:

# 使用默認(rèn)User model時(shí)
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
<class 'django.contrib.auth.models.User'>
# 使用自定義User model時(shí)
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
<class 'xxx.models.NewUser'>
# get_user_model()實(shí)際獲取的是settings.AUTH_USER_MODEL指定的User model

Django 允許在 settings.py 文件中定義 AUTH_USER_MODEL 覆蓋默認(rèn)的 auth.User,以滿足特定項(xiàng)目的需求。所以,ModelBacakend 的 authenticate 方法首先會(huì)通過(guò) username 嘗試獲取 User 對(duì)象,再去校驗(yàn)密碼是否正確以及 is_active 的狀態(tài),最后返回 User 對(duì)象或是返回 None。在? settings.py 配置 AUTH_USER_MODEL 格式如下所示:

#格式: "<django_app名>.<model名>"
AUTH_USER_MODEL = "appname.NewUser" 
#在models.py編寫(xiě)示例
from django.conf import settings
from django.db import models
class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=100)

在 django/contrib/auth/__init__.py 文件中定義了用戶的各種行為,例如,登錄、退出、用戶的認(rèn)證等等,通過(guò)這些可見(jiàn) Django 的強(qiáng)大所在,Auth 應(yīng)用模塊可以幫助開(kāi)發(fā)者減少很多的工作量,而且 Auth 應(yīng)用的源碼可以給開(kāi)發(fā)者提供諸多的用戶系統(tǒng)重寫(xiě)思路。?

到此這篇關(guān)于Django Auth應(yīng)用實(shí)現(xiàn)用戶身份認(rèn)證的文章就介紹到這了,更多相關(guān)Django Auth應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pandas操作MySQL的方法詳解

    Pandas操作MySQL的方法詳解

    這篇文章主要介紹了如何使用Pandas來(lái)操作MySQL數(shù)據(jù)庫(kù)。主要是包含查詢MySQL中的數(shù)據(jù),以及如何往數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù),感興趣的小伙伴可以了解一下
    2022-08-08
  • python樹(shù)莓派通過(guò)隊(duì)列實(shí)現(xiàn)進(jìn)程交互的程序分析

    python樹(shù)莓派通過(guò)隊(duì)列實(shí)現(xiàn)進(jìn)程交互的程序分析

    這篇博客就結(jié)合實(shí)際的python程序通過(guò)隊(duì)列實(shí)現(xiàn)進(jìn)程交互,通過(guò)程序分析需要的庫(kù)函數(shù),對(duì)python樹(shù)莓派進(jìn)程交互相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-07-07
  • 使用Python實(shí)現(xiàn)首頁(yè)通知功能

    使用Python實(shí)現(xiàn)首頁(yè)通知功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)首頁(yè)通知功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 如何用python做逐步回歸

    如何用python做逐步回歸

    這篇文章主要介紹了如何用python 做逐步回歸,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn)

    使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn)

    本文主要介紹了使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • python 寫(xiě)入csv亂碼問(wèn)題解決方法

    python 寫(xiě)入csv亂碼問(wèn)題解決方法

    這篇文章主要介紹了python 寫(xiě)入csv亂碼問(wèn)題解決方法的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 基于Python制作三款起床鬧鐘的示例代碼

    基于Python制作三款起床鬧鐘的示例代碼

    每天上班最痛苦的事情就是早起早起早起!這是大部分上班族的痛苦,但是不上班又是不可能的啦,因?yàn)槎际菫榱烁沐X(qián)。本文用Python制作了三款有趣的鬧鐘,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • python字典DICT類(lèi)型合并詳解

    python字典DICT類(lèi)型合并詳解

    這篇文章主要為大家詳細(xì)介紹了python字典DICT類(lèi)型合并,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Python中使用subprocess庫(kù)創(chuàng)建附加進(jìn)程

    Python中使用subprocess庫(kù)創(chuàng)建附加進(jìn)程

    這篇文章主要介紹了subprocess庫(kù):Python中創(chuàng)建附加進(jìn)程的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 使用Python操作Jenkins的過(guò)程詳解

    使用Python操作Jenkins的過(guò)程詳解

    借助于Python中的python-jenkins模塊,我們可以輕松地編寫(xiě)腳本來(lái)連接到Jenkins服務(wù)器,并執(zhí)行各種操作,如創(chuàng)建、刪除、構(gòu)建Jobs等,這種自動(dòng)化的方式不僅提高了效率,還使得CI/CD流程更加靈活和可控,本文介紹如何使用Python操作Jenkins的相關(guān)資料,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

晋江市| 泰顺县| 东港市| 福海县| 奎屯市| 贵德县| 满洲里市| 九龙县| 临夏市| 泊头市| 黄梅县| 汶川县| 霞浦县| 贵溪市| 东安县| 仙桃市| 格尔木市| 固始县| 东丰县| 巩义市| 屏东市| 平江县| 福鼎市| 清镇市| 即墨市| 临海市| 漳平市| 启东市| 无极县| 斗六市| 祥云县| 老河口市| 大余县| 塔河县| 北辰区| 呈贡县| 平阴县| 专栏| 左贡县| 郑州市| 乌苏市|