Django中的auth模塊
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模塊