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

django authenticate用戶身份認(rèn)證的項(xiàng)目實(shí)踐

 更新時(shí)間:2023年08月10日 11:50:38   作者:liulanba  
Django的contrib.auth模塊中的authenticate()函數(shù)用于對(duì)用戶的憑據(jù)進(jìn)行身份驗(yàn)證,本文就來(lái)介紹一下django authenticate用戶身份認(rèn)證的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

authenticate

Django的contrib.auth模塊中的authenticate()函數(shù)用于對(duì)用戶的憑據(jù)進(jìn)行身份驗(yàn)證,與已配置的身份驗(yàn)證后端進(jìn)行比較。

當(dāng)用戶嘗試登錄時(shí),authenticate()函數(shù)將使用用戶的憑據(jù)(即用戶名和密碼)作為參數(shù)進(jìn)行調(diào)用,該函數(shù)然后檢查可用的身份驗(yàn)證后端以驗(yàn)證憑據(jù),這些后端在項(xiàng)目的settings.py文件中定義,如果憑據(jù)有效,則authenticate()函數(shù)返回已認(rèn)證的用戶對(duì)象;否則,它返回None。
在成功身份驗(yàn)證后,可以使用Django的login()函數(shù)登錄用戶。

認(rèn)證后端

1.AUTHENTICATION_BACKENDS是Django設(shè)置中的一個(gè)參數(shù),它定義了用于身份驗(yàn)證的后端認(rèn)證方式。這個(gè)參數(shù)是一個(gè)字符串列表,包含Django認(rèn)證系統(tǒng)使用的認(rèn)證后端類的全名。

2.當(dāng)用戶嘗試進(jìn)行身份驗(yàn)證時(shí),Django將按照AUTHENTICATION_BACKENDS中定義的順序,嘗試每個(gè)后端認(rèn)證方式,直到找到一個(gè)認(rèn)證方式成功為止。如果所有后端認(rèn)證方式都失敗,則身份驗(yàn)證失敗。

3.默認(rèn)情況下,Django使用ModelBackend作為身份驗(yàn)證后端,它基于Django中的用戶模型進(jìn)行身份驗(yàn)證。除此之外,Django還提供了其他的身份驗(yàn)證后端,如LDAPBackend、RemoteUserBackend等,也可以自定義身份驗(yàn)證后端。

4.通過(guò)配置AUTHENTICATION_BACKENDS參數(shù),可以對(duì)身份驗(yàn)證后端進(jìn)行定制,以滿足具體項(xiàng)目的需求。例如,如果你的項(xiàng)目需要使用LDAP進(jìn)行用戶身份驗(yàn)證,則可以添加LDAPBackend到AUTHENTICATION_BACKENDS列表中,以便Django使用LDAPBackend進(jìn)行身份驗(yàn)證。

from django.contrib.auth import authenticate
from django.contrib.auth import login as user_login
def my_login(request):
    """
    登錄視圖
    :param request:
    :return:
    """
    if request.method == "POST":
        login_form = users_form.UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            myuser = authenticate(username=username, password=password)
            if myuser is not None:
                user_login(request, myuser)

這段代碼使用Django的contrib.auth模塊來(lái)進(jìn)行用戶身份驗(yàn)證和登錄。
首先,它調(diào)用authenticate()函數(shù)驗(yàn)證用戶的憑據(jù),如果憑據(jù)有效,則authenticate()函數(shù)將返回已認(rèn)證的用戶對(duì)象,并將其賦給myuser變量。如果憑據(jù)無(wú)效,則authenticate()函數(shù)將返回None。
接著,代碼檢查myuser變量是否為None。如果myuser不為None,則說(shuō)明憑據(jù)有效,并且代碼將調(diào)用user_login()函數(shù)來(lái)將該用戶登錄到當(dāng)前會(huì)話中。user_login()函數(shù)需要傳遞一個(gè)request對(duì)象和已認(rèn)證的用戶對(duì)象。登錄成功后,用戶可以訪問(wèn)需要認(rèn)證的頁(yè)面和視圖。
如果myuser為None,則說(shuō)明憑據(jù)無(wú)效,用戶無(wú)法登錄。

myuser 和 request.user 是兩個(gè)不同的對(duì)象,其區(qū)別在于:
1.myuser 表示通過(guò)用戶名和密碼認(rèn)證成功后得到的用戶對(duì)象, 是通過(guò)表單驗(yàn)證之后從數(shù)據(jù)庫(kù)中查詢出來(lái)的用戶對(duì)象,即 authenticate 方法返回的對(duì)象。主要用來(lái)檢查用戶輸入的用戶名和密碼是否正確,并在認(rèn)證成功后設(shè)置一些 session 變量。
2.request.user 表示當(dāng)前請(qǐng)求的用戶對(duì)象,是通過(guò) Django 的認(rèn)證系統(tǒng)得到的用戶對(duì)象,包括通過(guò)認(rèn)證的用戶和未認(rèn)證的用戶。如果用戶已通過(guò)認(rèn)證,則該對(duì)象是一個(gè) User 實(shí)例,否則是一個(gè) AnonymousUser 實(shí)例。 主要用來(lái)獲取當(dāng)前認(rèn)證的用戶信息,例如用戶的用戶名、郵箱等。這些信息通常用來(lái)顯示在頁(yè)面上,或者用來(lái)判斷當(dāng)前用戶是否有權(quán)限進(jìn)行某些操作。

因此,在這個(gè)方法中,myuser 和 request.user 作用是相同的,都是用來(lái)判斷用戶是否已通過(guò)認(rèn)證,但是可能是不同的對(duì)象,因?yàn)?myuser 只在用戶認(rèn)證成功后才會(huì)有值,而 request.user 則是在每個(gè)請(qǐng)求中都會(huì)有值,不論用戶是否通過(guò)認(rèn)證。同時(shí),在這個(gè)方法中,myuser 和 request.user 都可以用來(lái)檢查用戶是否已通過(guò)認(rèn)證,但是只有 request.user 才可以用來(lái)獲取當(dāng)前認(rèn)證的用戶信息。

authenticate函數(shù)如下:

@sensitive_variables("credentials")
def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        backend_signature = inspect.signature(backend.authenticate)
        try:
            backend_signature.bind(request, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try
            # the next one.
            continue
        try:
            user = backend.authenticate(request, **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

_get_backends會(huì)從settings.py中讀取AUTHENTICATION_BACKENDS定義的后端路徑:

def _get_backends(return_tuples=False):
    backends = []
    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
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'backends.user_backend.UserBackend'
]

AUTHENTICATION_BACKENDS列表中包含了兩個(gè)認(rèn)證后端,分別是ModelBackend和UserBackend。Django將按照列表中的順序依次嘗試這兩個(gè)認(rèn)證后端,直到找到一個(gè)成功為止。

UserBackend需要繼承BaseBackend并實(shí)現(xiàn)一個(gè)authenticate函數(shù):

from django.contrib.auth.backends import BaseBackend
from users.models import MyUser
class UserBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            myuser = MyUser.objects.get(name=username)
            if myuser.check_password(password):
                return myuser
        except MyUser.DoesNotExist as e:
            print("user no exist", e)
            return None
    def get_user(self, user_id):
        try:
            return MyUser.objects.get(pk=user_id)
        except MyUser.DoesNotExist:
            return None

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

相關(guān)文章

  • python多線程下信號(hào)處理程序示例

    python多線程下信號(hào)處理程序示例

    這篇文章主要為大家詳細(xì)介紹了python多線程下信號(hào)處理程序示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • python游戲?qū)崙?zhàn)項(xiàng)目之智能五子棋簡(jiǎn)易版

    python游戲?qū)崙?zhàn)項(xiàng)目之智能五子棋簡(jiǎn)易版

    利用Python實(shí)現(xiàn)智能五子棋,實(shí)現(xiàn)之后發(fā)現(xiàn)我玩不贏它!本篇為你帶來(lái)用python編寫(xiě)的五子棋小游戲,文中給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09
  • python3 圖片referer防盜鏈的實(shí)現(xiàn)方法

    python3 圖片referer防盜鏈的實(shí)現(xiàn)方法

    本篇文章主要介紹了python3 圖片referer防盜鏈的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果

    Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果

    Tkinter 是 Python 的標(biāo)準(zhǔn) GUI(Graphical User Interface,圖形用戶接口)庫(kù),Python 使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。這篇文章主要介紹了Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器,需要的朋友可以參考下
    2020-01-01
  • 簡(jiǎn)化Python的Django框架代碼的一些示例

    簡(jiǎn)化Python的Django框架代碼的一些示例

    這篇文章主要介紹了簡(jiǎn)化Python的Django框架代碼的一些示例,實(shí)際上文中只是抽取了一些Django中最基本的功能用于簡(jiǎn)化入門(mén)者的上手復(fù)雜度,下,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法

    Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python實(shí)現(xiàn)查詢某個(gè)目錄下修改時(shí)間最新的文件示例

    Python實(shí)現(xiàn)查詢某個(gè)目錄下修改時(shí)間最新的文件示例

    這篇文章主要介紹了Python實(shí)現(xiàn)查詢某個(gè)目錄下修改時(shí)間最新的文件,涉及Python使用os與shutil模塊針對(duì)文件的遍歷、屬性獲取、讀寫(xiě)等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python函數(shù)裝飾器的使用詳解

    Python函數(shù)裝飾器的使用詳解

    大家好,本篇文章主要講的是Python函數(shù)裝飾器的使用詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • python使用matplotlib繪制折線圖教程

    python使用matplotlib繪制折線圖教程

    Matplotlib是一個(gè)Python工具箱,用于科學(xué)計(jì)算的數(shù)據(jù)可視化。借助它,Python可以繪制如Matlab和Octave多種多樣的數(shù)據(jù)圖形。下面這篇文章主要介紹了python使用matplotlib如何繪制折線圖的方法教程,需要的朋友可以參考借鑒。
    2017-02-02
  • 教你使用Python獲取QQ音樂(lè)某個(gè)歌手的歌單

    教你使用Python獲取QQ音樂(lè)某個(gè)歌手的歌單

    這篇文章主要介紹了Python獲取QQ音樂(lè)某個(gè)歌手的歌單,從qq音樂(lè)中獲取某個(gè)你喜歡的歌手的清單,涉及到的庫(kù)有requests、json,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

安多县| 怀仁县| 普安县| 广饶县| 宜阳县| 云浮市| 东乌珠穆沁旗| 普宁市| 宜良县| 萨嘎县| 秀山| 大化| 博白县| 左权县| 清苑县| 池州市| 汉川市| 景东| 凌源市| 黄骅市| 安新县| 恩平市| 凤城市| 色达县| 天峻县| 柳州市| 军事| 镇坪县| 宣化县| 石台县| 松潘县| 富裕县| 鄂伦春自治旗| 西畴县| 卢龙县| 池州市| 新津县| 衡水市| 丹东市| 石渠县| 西林县|