1. 程式人生 > >Django中的auth模塊

Django中的auth模塊

用戶登錄 .com 數據庫操作 判斷 type 存儲 print inf 返回

1,創建超級用戶

  • 在命令行輸入:python manage.py createsuperuser

技術分享圖片

技術分享圖片

技術分享圖片

2,認證校驗用戶名和密碼(authenticate方法)

先得導入auth模塊:from django.contrib import auth

  語法:obj = auth.authenticate(request, username, password)

認證成功返回一個對象,認證失敗是 None

authenticate提供了用戶認證功能,即驗證用戶名以及密碼是否正確,一般需要username,passeord兩個關鍵字參數,如果認證成功(用戶名正確有效),變回返回一個User對象.

authenticate()會在給User()對象上設置一個屬性來標識後端已經認證了該系統,且該信息在後續登錄過程中是需要的(看圖說話)

技術分享圖片

技術分享圖片

相關代碼:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
from about_auth.froms import RegForm



def login(request):
    # 如果請求進來是提交數據
    if request.method == "POST":
        # 獲取用戶輸入的值
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 1,驗證用戶名及密碼是否正確需要用username,password關鍵字
        obj = auth.authenticate(username=user,password=pwd)
        # 當認證成功的時候返回一個User對象,認證不成功返回一個None
        print(obj,type(obj))
        # 2,判斷obj的屬性
        # 2.1,如果obj這個對象是User保存session數據,無返回值
        if obj:
            data = auth.login(request, obj)
            print(data)
            # 獲取到用戶輸入的地址
            next = request.GET.get("next")
            # 判斷用戶輸入的地址,如果是login,此時next就是None,否則就不是
            if next:
                redirect(next)
            else:
                redirect("/login")
        
    # 第一次進來是get請求,返回給用戶一個登錄頁面
    return render(request, "login.html")

3,保存登錄狀態,記錄到session(login(request, user))

  該函數接收一個HttpRequest對象,以及一個經過認證的User對象,該函數實現一個用戶登錄的功能,它本質上會在後端為該用戶生成相關session數據

相關代碼:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
from about_auth.froms import RegForm



def login(request):
    # 如果請求進來是提交數據
    if request.method == "POST":
        # 獲取用戶輸入的值
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 1,驗證用戶名及密碼是否正確需要用username,password關鍵字
        obj = auth.authenticate(username=user,password=pwd)
        # 當認證成功的時候返回一個User對象,認證不成功返回一個None
        print(obj,type(obj))
        # 2,判斷obj的屬性
        # 2.1,如果obj這個對象是User保存session數據,無返回值
        if obj:
            data = auth.login(request, obj)
            print(data)
            # 獲取到用戶輸入的地址
            next = request.GET.get("next")
            # 判斷用戶輸入的地址,如果是login,此時next就是None,否則就不是
            if next:
                redirect(next)
            else:
                redirect("/login")
        
    # 第一次進來是get請求,返回給用戶一個登錄頁面
    return render(request, "login.html")

4,註銷(logout(request))

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

相關代碼:

def logout(request):
    # 把session的數據刪除掉
    auth.logout(request)
    return redirect("/login/")

5,判斷登錄狀態:用來判斷當前請求是否通過了認證(is_authenticated())

def index(request):
    # 判斷登錄狀態,返回一個布爾值,如果成功返回一個True,for則False
    print(request.user.is_authenticated())

    return render(request, "index.html")

6,創建用戶 :

  • 表名.objects.create(),   創建普通用戶,密碼是明文的
  • 表名.obiects.create_表名, 創建普通用戶,密碼是密文的
  • 表名.objects.create_super表名 創建超級用戶,密碼是密文的

代碼如下:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
from about_auth.froms import RegForm
from django.contrib.auth.models import User
from about_auth.froms import RegForm

def register(request):
    form_obj = RegForm()
    # 第二次進來是POST請求提交數據
    if request.method == "POST":
        # 實例化一個RegForm的對象,去校驗提交的數據是否合法
        form_obj = RegForm(request.POST)
        # 如果通過了校驗
        if form_obj.is_valid():
            # 獲取有效的數據,是一個字典
            data_dict = form_obj.cleaned_data
            # 把再次輸入的密碼刪除掉,然後存儲到數據庫中
            data_dict.pop("re_password")
            # 把數據更新到數據庫中
            # 1,註冊超級用戶 ,密碼是密文的
            # User.objects.create_superuser(email="", **data_dict)
            # 2,註冊普通用戶,密碼是密文的
            # User.objects.create_user(**data_dict)
            # 3,註冊普通用戶,密碼是明文的
            User.objects.create(**data_dict)
            return HttpResponse("註冊成功")

    return render(request, "register.html", {"form_obj": form_obj})

7,和密碼相關

  驗證舊密碼:request.表名.check_password("root1234")

  設置密碼:request.表名.set_password("admin1234")

  request.表名.save()

代碼演示:

def index(request):
    # 判斷登錄狀態,返回一個布爾值,如果成功返回一個True,for則False
    print(request.user.is_authenticated())
    # 修改密碼,先獲取用戶輸入的舊密碼和數據庫中存放的原密碼是否一致,
    # 一致的情況下,把用戶新輸入的密碼存放到數據庫中

    # 把數據庫中放入密碼拿出來和用戶數日的密碼做校驗,如果一致
    if request.user.check_password("root1234"):
        # 就把用戶再次輸入的密碼更新到數據庫中
        request.user.set_password("admin1234")
        # 記得save()把對數據庫在ORM的操作,變成數據庫操作
        request.user.save()
    return render(request, "index.html")

8,擴展默認的auth_user表

我們可以通過繼承內置的AbstracUser類,來定義一個自己的Model類,

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

註意:有時拓展表以後,需要在settings中加

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

定要在settings.py中告訴Django,我現在使用我新定義的UserInfo表來做用戶認證。(表名發生了變化)

Django中的auth模塊