『Django』第N+1節 Django自帶的認證系統 - auth

来源:https://www.cnblogs.com/BlameKidd/archive/2019/07/03/11124044.html
-Advertisement-
Play Games

個人網站: lipeiguan.top 以後會慢慢轉移到個人網站, 歡迎大家收藏^ . ^ 寫在前面 我們在開發一個網站的時候, 經常需要實現網站的用戶系統. 這個時候我們需要實現用戶註冊、用戶登錄、用戶認證、註銷、修改密碼等一系列功能. 如果我們都是自己實現的話, 不是不可以, 只是有些浪費時間. ...


個人網站: lipeiguan.top
以後會慢慢轉移到個人網站, 歡迎大家收藏^ . ^

寫在前面

我們在開發一個網站的時候, 經常需要實現網站的用戶系統. 這個時候我們需要實現用戶註冊、用戶登錄、用戶認證、註銷、修改密碼等一系列功能. 如果我們都是自己實現的話, 不是不可以, 只是有些浪費時間.
而Django則內置了一個用戶認證系統 --> auth, 它預設使用 auth_user表來儲存用戶的數據.
那麼接下來就來瞭解一下這個強大的用戶認證系統.

auth模塊

導入auth

要使用這個模塊, 就需要先導入它.

from django.contrib import auth

auth模塊中的各種方法

authenticate()

  • 驗證用戶名以及密碼是否正確

該函數提供了用戶認證功能, 一般需要username、password兩個關鍵字參數.
如果用戶名和密碼正確, 則會返回一個User對象, authenticate()會在該User對象上設置一個屬性來標識後端已經認證了該用戶, 而且該信息在後續的登錄過程中是需要的.
具體用法:

user = auth.authenticate(request, username="username", password="password")

login(HttpRequest, user)

  • 登錄

該函數接受一個HttpRequest對象, 以及一個經過認證的User對象.
主要實現了一個用戶登錄的功能, 它會在後端為該用戶生成相關的session數據.
具體用法:

from django.shortcuts import render, redirect
from django.contrib import auth


def my_login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = auth.authenticate(request, username=username, password=password)
        if user:
            auth.login(request, user)
            # Redirect to a success page.
        else:
            # Return an "invalid login" error message.
    return render(request, "login.html")

logout(request)

  • 註銷用戶

該函數接受一個HttpRequest對象, 無返回值.
當調用該函數時, 當前請求的session信息會全部清除. 該用戶即使沒有登錄, 使用該函數也不會報錯.
具體用法:

from django.authenticate import auth


def logout(request):
    auth.logout(request)
    # Redirect to a success page.
    return redirect('/login/')

is_authenticated()

  • 判斷當前請求是否通過了認證

如果一個頁面需要登錄才能訪問, 一個用戶在沒有登錄的情況下就訪問該頁面的話就會直接跳轉到登錄頁面, 之後在完成登錄之後, 會自動訪問跳轉之前的頁面.
具體用法:

def login(request):
    if not request.user.is_authenticated();
        return redirect("%s?next=%s" % (settings.LOGIN_URL, requedt.path))

Django也為我們設計好了一個用於該情況的裝飾器. 見 login_required()

login_required()

  • 登錄校驗

auth給我們提供了一個裝飾器工具, 用來快捷的給某個視圖添加登錄校驗.
具體用法:

from django.contrib.auth.decorators import login_required


@login_required
def index(request):
    ...

若用戶沒有登錄, 則會跳轉到Django預設的登錄URL: 'accounts/login', 並傳遞當前訪問URL的絕對路徑(登錄成功後, 會重定向到該路徑).

當然, 我們可以自定義登錄的URL, 在settings.py文件中添加如下代碼

LOGIN_URL = '/login/'

create_user()

  • 創建新用戶

auth提供的一個創建新用戶的方法, 需要提供必要參數(username、password)等.
具體用法:

from django.contrib.auth.models import User


user = User.objects.create_user(username="用戶名", password="密碼", email="郵箱(可以為空)", ...)

create_superuser()

  • 創建超級用戶

auth提供一個創建新的超級用戶的方法, 需要提供必要參數(username, password)等.
具體用法:

from django.contrib.auth.models import User


user = User.objects.create_superuser(username="用戶名", password="密碼", email="郵箱", ...)

check_password(password)

  • 檢查密碼是否正確

auth提供一個檢查密碼是否正確的方法, 需要提供當前請求用戶的密碼.
比如當用戶需要修改密碼時, 要輸入原來的密碼, 如果輸入的字元串通過了密碼檢查, 則返回 True, 否則返回 False.
具體用法:

ok = request.user.check_password("密碼")

set_password(password)

  • 修改密碼

auth提供的一個修改密碼的方法, 接收 要設置的新密碼 作為參數.
註意: 設置完一定要調用用戶對象的save方法!!!
具體用法:

request.user.set_password("密碼")
request.user.save()

登錄、修改密碼、註冊、註銷功能示例

登錄:

def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user_obj = auth.authenticate(request, username=username, password=password)
        if user_obj:
            # 記錄登錄狀態
            auth.login(request, user_obj)
            next = request.GET.get("next")
            if next:
                return redirect(next)
            return redirect('/index/')
    return render(request, "login.html")

修改密碼:

@login_required
def set_password(request):
    user = request.user
    error_message = ""
    if request.method == "POST":
        old_password = request.POST.get("old_password")  # 舊密碼
        new_password = request.POST.get("new_password")  # 新密碼
        repeat_password = request.POST.get("repeat_password")  # 重覆密碼
        if user.check_password(old_password):
            if not new_password:
                error_message = "新密碼不能為空"
            elif new_password != repeat_password:
                error_message = "兩次密碼不一致"
            else:
                user.set_password(new_password)
                user.save()
                return redirect('/login/')
        else:
            error_message = "原密碼輸入有誤"
            return render(request, "set_password.html", {"error_message": erroe_message})
    return render(request, "set_password.html")

註冊:

def reg(request):
    error_message = ""
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        repeat_password = request.POST.get("repeat_password")
        if password:
            if password != repeat_password:
                error_message = "密碼輸入不一致"
            else:
                User.objects.create_user(username=username, password=password)
                return redirect('/login/')
        else:
            error_message = "密碼不能為空"
    return render(request, "reg.html")

註銷:

def logout(request):
    auth.logout(request)
    return redirect('/login/')

User對象的屬性

  • id
  • username: 用戶名
  • password: 密碼
  • email: 郵箱
  • is_staff: 用戶是否擁有網站的管理許可權
  • is_active: 是否允許用戶登錄. 設置為False, 可以在不刪除用戶的前提下禁止用戶登錄
  • is_superuser: 是否是超級用戶
  • last_login: 最後登錄時間
  • first_name: 名
  • last_name: 姓
  • date_joined

    擴展預設的auth_user表

    Django內置的認證系統很好用,但是提供的auth_user表的欄位只有那麼幾個, 如果需要增加幾個欄位該怎麼辦呢?
    比如說想增加一個存儲用戶手機號的欄位, 就可以通過繼承內置的AbstractUser類, 來定義一個自己的Model類.
    這樣既可以根據項目需求設計用戶表, 也可以使用Django的認證系統.
    具體方法:
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

註意:
只是按照上面的方式擴展了內置的auth_user表之後還不夠, 還需要在settings.py文件中告訴Django, 我現在使用我定義的UserInfo表來做用戶認證.
在settings.py中添加如下代碼:

# 引用Django自帶的User表, 繼承時需要設置
AUTH_USER_MODEL = "app名.UserInfo"

註意:
一旦我們指定了新的認證系統所使用的表, 就需要重新在資料庫中創建表, 而不能繼續使用原來預設的auth_user表了.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一年前,當我和小伙伴小龍一起做一個外包項目的時候,受到了嚴重的鄙視。我那時候還不知道 Maven,所以搭建項目用的還是最原始的方式,小龍不得已在導入項目的時候花了很長時間去下載項目依賴的開源類庫。 出於對我的尊重,小龍沒有破口大罵,而是非常委婉地說了一句:“二哥,你好歹也有一定的知名度了,竟然沒用 ...
  • Go程式是怎樣跑起來的?本文從編碼、編譯、彙編、鏈接、運行、退出這些環節一一探索。 ...
  • ![](https://img2018.cnblogs.com/blog/1728961/201907/1728961-20190703082545108-1217931464.png) ...
  • 本人在 .NET 轉JAVA 的路上 ,也在學習SpringBoot相關知識,這裡記錄一下在Springboot中實現文件上傳下載的核心代碼 源碼下載地址: https://github.com/struggle0903/SpringBootfiledemo.git ...
  • 點擊屏幕拍打你的翅膀。當你飛過屏幕時,註意黑烏鴉。 下載地址 ...
  • 看一個數組的子集有多少,其實就是排列組合, 比如:[0,1] 對應的子集有:[] [0] [1] [1,1] 這四種。 一般對應有兩種方法: 位運算 和 回溯 。 這裡先使用位運算來做。 位運算 一個長度為n的數組,對其做排列組合,可以理解為:這n個數字中,有哪些是存在的,哪些是不存在的。 例如,數 ...
  • Python模塊和包 一、模塊 1. 什麼是模塊 常見的場景:一個模塊就是一個包含了Python定義和聲明的文件,文件名就是模塊名字加上.py的尾碼。 但其實import載入的模塊分為四個通用類別: 1 使用Python編寫的代碼(.py文件) 2 已被編譯為共用庫或DLL的C或C++擴展 3 包好 ...
  • 一、檢視一個函數相同的另一種方法 利用屬性:函數._name 從結果來看他們的本體都是hello函數 二、裝飾器 1.定義:在不改動代碼的基礎上無限擴展函數功能的一種機制,本質上來講,裝飾器是一個返回函數的高階函數。 2.裝飾器的使用:使用@愈發,即在每次要擴展到函數定義前使用@+函數名。 3.裝飾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...