『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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...