Django框架之auth模塊

目錄

一、Auth模塊引入

二、創建超級用戶(管理員)

三、依賴于auth_user表完成登錄注冊功能

【1】基礎登陸

【2】保存用戶狀態

【3】登錄后跳轉

(1)? 登錄后才能訪問頁面 -- 局部配置

(2)? 登錄后才能訪問頁面 -- 全局配置

(3)?小結

三、修改密碼

四、注銷

五、注冊功能

六、方法總結

【1】校驗密碼是否正確

【2】保存用戶狀態

【3】判斷當前用戶是否登錄

【4】獲取當前登錄的用戶

【5】檢驗用戶是否登錄裝飾器

【6】校驗原密碼

【7】修改密碼

【8】注銷登錄用戶

【9】注冊

七、擴展?auth_user?表

【1】方式一

【2】方式二


一、Auth模塊引入

  • 我們在創建一個Django項目之后,直接執行數據庫遷移命令會自動生成很多表
    • django_session
    • auth_user
  • Django在啟動之后就可以直接訪問admin路由,需要輸入用戶名和密碼,數據參考的就是auth_user表,并且必須是管理員用戶才能進入

二、創建超級用戶(管理員)

python3 manage.py createsuperuser
E:\Python39\python.exe "E:\Pycharm\PyCharm 2023.1.3\plugins\python\helpers\pycharm\django_manage.py" createsuperuser "E:/Old Boy/django_project/day14"
Tracking file by folder pattern:  migrations
Username (leave blank to use 'administrator'):  dream
Email address:  
Warning: Password input may be echoed.
Password:  521
Warning: Password input may be echoed.
Password (again):  521
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: This password is entirely numeric.y
Superuser created successfully.Process finished with exit code 0

三、依賴于auth_user表完成登錄注冊功能

【1】基礎登陸

  • 路由?
path('login/', views.login),
  • 前端
<form action="" method="post">{#  取消crsf校驗  #}{% csrf_token %}<p>username:<input type="text" name="username"></p><p>password:<input type="text" name="password"></p><input type="submit" class="btn btn-success">
</form>
  • 后端?
from django.shortcuts import render
from django.contrib import auth# Create your views here.
def login(request):if request.method == 'POST':# (1) 取到前端輸入的用戶名和密碼username = request.POST.get('username')password = request.POST.get('password')# (2) 進行用戶名和密碼的校驗# 從用戶表中獲取數據# --- 1、表如何獲取# --- 2、表中的密碼是密文,如何比對# 導入 auth 校驗模塊 : from django.contrib import authuser_obj = auth.authenticate(request, username=username, password=password)# [1] 用戶名和密碼正確的情況下print(user_obj)  # dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法print(user_obj.username)  # dreamprint(user_obj.password)  # pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=# [2] 用戶名和密碼不正確的情況下print(user_obj)  # None ---- 如果數據不符合則返回None'''【1】自動查找 auth_user 表【2】自動給密碼加密進行比對注意事項:參數必須傳入用戶名和密碼不能只傳入一個用戶名(一步就幫助我們篩選出用戶數據)'''return render(request, 'login.html')

【2】保存用戶狀態

  • 如果使用auth模塊,就使用其中所有封裝好的方法
    • 如果不想使用,就單獨封裝方法,不要調用其中的方法
  • auth.login(request, user_obj)
    • 類似于 request.session[key] = user_obj
    • 只要執行了上面的方法,就可以在任何地方通過 request.user 獲取當前用戶的登錄對象
from django.shortcuts import render
from django.contrib import auth# Create your views here.
def login(request):if request.method == 'POST':# (1) 取到前端輸入的用戶名和密碼username = request.POST.get('username')password = request.POST.get('password')# (2) 進行用戶名和密碼的校驗# 從用戶表中獲取數據# --- 1、表如何獲取# --- 2、表中的密碼是密文,如何比對# 導入 auth 校驗模塊 : from django.contrib import authuser_obj = auth.authenticate(request, username=username, password=password)# 判斷當前用戶是否存在 --- 存在則有值,不存在則返回Noneif user_obj:# 保存用戶狀態auth.login(request, user_obj)  # 類似于 request.session[key] = user_obj# 只要執行了上面的方法,就可以在任何地方通過 request.user 獲取當前用戶的登錄對象'''【1】自動查找 auth_user 表【2】自動給密碼加密進行比對注意事項:參數必須傳入用戶名和密碼不能只傳入一個用戶名(一步就幫助我們篩選出用戶數據)'''return render(request, 'login.html')

【3】登錄后跳轉

from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth# Create your views here.
def login(request):if request.method == 'POST':# (1) 取到前端輸入的用戶名和密碼username = request.POST.get('username')password = request.POST.get('password')# (2) 進行用戶名和密碼的校驗# 從用戶表中獲取數據# --- 1、表如何獲取# --- 2、表中的密碼是密文,如何比對# 導入 auth 校驗模塊 : from django.contrib import authuser_obj = auth.authenticate(request, username=username, password=password)# 判斷當前用戶是否存在 --- 存在則有值,不存在則返回Noneif user_obj:# 保存用戶狀態auth.login(request, user_obj)  # 類似于 request.session[key] = user_obj# 只要執行了上面的方法,就可以在任何地方通過 request.user 獲取當前用戶的登錄對象# 登陸成功后跳轉頁面return redirect('/home/')'''【1】自動查找 auth_user 表【2】自動給密碼加密進行比對注意事項:參數必須傳入用戶名和密碼不能只傳入一個用戶名(一步就幫助我們篩選出用戶數據)'''return render(request, 'login.html')def home(request):print(request.user)  # dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法print(request.user)# 登陸成功: dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法# 未登錄訪問: AnonymousUser ---- 匿名用戶# 本質上是自動去django_session里面查找到當前用戶對象,然后封裝到 request.user 中return HttpResponse("OK")
  • 判斷用戶是否登錄
def home(request):print(request.user)# 登陸成功: dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法# 未登錄訪問: AnonymousUser ---- 匿名用戶# 本質上是自動去django_session里面查找到當前用戶對象,然后封裝到 request.user 中# 判斷用戶是否登陸print(request.user.is_authenticated()) # 匿名用戶返回 Falsereturn HttpResponse("OK")

(1)? 登錄后才能訪問頁面 -- 局部配置

from django.contrib.auth.decorators import login_required# 添加裝飾器 --- 指定未登錄的跳轉頁面
@login_required(login_url='/login/') # 局部配置
def home(request):'''用戶登錄后才能訪問的頁面'''print(request.user)# 登陸成功: dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法# 未登錄訪問: AnonymousUser ---- 匿名用戶# 本質上是自動去django_session里面查找到當前用戶對象,然后封裝到 request.user 中# 判斷用戶是否登陸print(request.user.is_authenticated())  # 匿名用戶返回 Falsereturn HttpResponse("OK")
http://127.0.0.1:8000/accounts/login/?next=/home/

(2)? 登錄后才能訪問頁面 -- 全局配置

  • 在?settings?文件中添加
LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required# 添加裝飾器 --- 指定未登錄的跳轉頁面
@login_required
def home(request):'''用戶登錄后才能訪問的頁面'''print(request.user)# 登陸成功: dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法# 未登錄訪問: AnonymousUser ---- 匿名用戶# 本質上是自動去django_session里面查找到當前用戶對象,然后封裝到 request.user 中# 判斷用戶是否登陸print(request.user.is_authenticated())  # 匿名用戶返回 Falsereturn HttpResponse("OK")@login_required
def index(request):return HttpResponse("index")

(3)?小結

  • 局部/全局優先級

    • 局部大于全局
  • 各自的優點

    • 全局的好處在于無需書寫重復的代碼,但是頁面的跳轉很單一
    • 局部的好處是在于不同的視圖函數再用戶沒有登陸的情況下可以跳轉到不同的頁面

三、修改密碼

  • 路由
# 修改密碼
path('set_password/', views.set_password),
  • 后端?
@login_required
def set_password(request):if request.method == 'POST':old_password = request.POST.get('old_password')new_password = request.POST.get('new_password')confirm_password = request.POST.get('confirm_password')# 先校驗兩次密是否一致if new_password == confirm_password:# 校驗舊密碼是否相同is_right = request.user.check_password(old_password)  # 內部自己加密密碼進行比對# 返回的結果為  True 或者 Falseif is_right:# 修改密碼request.user.set_password(confirm_password) # 僅僅在修改對象的屬性# 修改完密碼后進行保存數據request.user.save()return redirect('/login/')return render(request, 'set_password.html', locals())
  • 前端?
<form action="" method="post">{#  取消crsf校驗  #}{% csrf_token %}<p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p><p>old_password:<input type="text" name="old_password"></p><p>new_password:<input type="text" name="new_password"></p><p>confirm_password:<input type="text" name="confirm_password"></p><input type="submit" class="btn btn-success">
</form>

四、注銷

  • 路由
# 注銷用戶
path('login_out/', views.login_out),
  • 后端
@login_required
def login_out(request):auth.logout(request)  # 清空當前登錄用戶的數據 ----- request.session.flush()return redirect('/login/')

五、注冊功能

  • 路由
# 注冊用戶
path('register/', views.register),
  • 后端
def register(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')confirm_password = request.POST.get('confirm_password')# 操作auth_user表寫入數據# User.objects.create(username=username, password=confirm_password)  # 會寫入數據,但是保存的密碼是明文的,沒有加密# 創建普通用戶User.objects.create_user(username=username, password=confirm_password)# 創建超級用戶 - 了解 --- 使用代碼創建超級用戶,郵箱和密碼是必填的,而用命令創建可以忽略郵箱# User.objects.create_superuser(username=username, password=password,email=email)return render(request, 'register.html')

六、方法總結

【1】校驗密碼是否正確

from django.contrib import auth
# (1) 取到前端輸入的用戶名和密碼
username = request.POST.get('username')
password = request.POST.get('password')
# (2) 進行用戶名和密碼的校驗 ---- 參數必須傳用戶名和密碼
user_obj = auth.authenticate(request, username=username, password=password)# [1] 用戶名和密碼正確的情況下
print(user_obj)  
# dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法
print(user_obj.username)  
# dream
print(user_obj.password)  
# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=# [2] 用戶名和密碼不正確的情況下
print(user_obj)  # None ---- 如果數據不符合則返回None

【2】保存用戶狀態

# 判斷當前用戶是否存在 --- 存在則有值,不存在則返回None
if user_obj:# 保存用戶狀態auth.login(request, user_obj)  # 類似于 request.session[key] = user_obj# 只要執行了上面的方法,就可以在任何地方通過 request.user 獲取當前用戶的登錄對象

【3】判斷當前用戶是否登錄

# 判斷用戶是否登陸
# 匿名用戶返回 False  正常用戶返回 True
print(request.user.is_authenticated())

【4】獲取當前登錄的用戶

print(request.user)
# 登陸成功: dream ---- 這是用戶對象內部封裝的一個方法 __str__ 方法
# 未登錄訪問: AnonymousUser ---- 匿名用戶
# 本質上是自動去django_session里面查找到當前用戶對象,然后封裝到 request.user 中

【5】檢驗用戶是否登錄裝飾器

from django.contrib.auth.decorators import login_required
  • (1) 局部配置

  • (2) 全局配置

  • (3) 全局/局部的優缺點

【6】校驗原密碼

# 校驗舊密碼是否相同
is_right = request.user.check_password(old_password)  # 內部自己加密密碼進行比對
# 返回的結果為  True 或者 False

【7】修改密碼

# 修改密碼
request.user.set_password(confirm_password)  # 僅僅在修改對象的屬性
# 修改完密碼后進行保存數據
request.user.save()

【8】注銷登錄用戶

auth.logout(request)  
# 清空當前登錄用戶的數據 ----- request.session.flush()

【9】注冊

# 操作auth_user表寫入數據
# 會寫入數據,但是保存的密碼是明文的,沒有加密
User.objects.create(username=username, password=confirm_password)
# 創建普通用戶
User.objects.create_user(username=username, password=confirm_password)
# 創建超級用戶 - 了解 --- 使用代碼創建超級用戶,郵箱和密碼是必填的,而用命令創建可以忽略郵箱
User.objects.create_superuser(username=username, password=password,email=email)

七、擴展?auth_user?表

【1】方式一

from django.db import models
from django.contrib.auth.models import User, AbstractUser# 第一種方式 : 面向對象的繼承
class UserInfo(AbstractUser):'''如果繼承了AbstractUser那么在執行數據庫遷移命令的時候,auth_user表就不會被創建而 UserInfo 會在 auth_user表 的基礎上添加自定義擴展的字段優點:直接通過自己定義的表快速完成操作及擴展前提(1)在執行之前沒有執行過數據庫遷移命令auth_user 表沒有被創建如果當前庫已經被創建,則需要更換新的庫(2)繼承的表里面不要覆蓋 AbstractUser 里面的字段名表里面有的字段不要動,只擴展額外的字段即可(3)需要再配置文件中聲明Django要使用 UserInfo 替代 auth_userAUTH_USER_MODEL = 'app01.UserInfo'  ---'應用名.表名''''phone = models.CharField(max_length=32)
  • 需要再配置文件中聲明 Django 要使用 UserInfo 替代 auth_user
AUTH_USER_MODEL = 'app01.UserInfo' ?---'應用名.表名'

  • 如果自己寫表代替了 auth_user
  • auth模塊功能正常使用,參考的表也由 auth_user 變成了 UserInfo

【2】方式二

from django.db import models
from django.contrib.auth.models import User, AbstractUser# Create your models here.
# 擴展 auth_user 表
# 第二種方式 : 一對一關系(不推薦)
class UserDetail(models.Model):phone = models.CharField(max_length=32)user = models.OneToOneField(to='User', on_delete=models.CASCADE)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot將多個圖片導出成zip壓縮包

Springboot將多個圖片導出成zip壓縮包 將多個圖片導出成zip壓縮包 /*** 判斷時間差是否超過6小時* param startTime 開始時間* param endTime 結束時間* return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定義日期時間格式DateTimeFormatt…

【數據結構】—搜索二叉樹(C++實現,超詳細!)

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;消えてしまいそうです—真夜中 1:15━━━━━━?&#x1f49f;──────── 4:18 &#x1f504; ?? ? ??…

函數計算的新征程:使用 Laf 構建 AI 知識庫

Laf 已成功上架 Sealos 模板市場&#xff0c;可通過 Laf 應用模板來一鍵部署&#xff01; 這意味著 Laf 在私有化部署上的擴展性得到了極大的提升。 Sealos 作為一個功能強大的云操作系統&#xff0c;能夠秒級創建多種高可用數據庫&#xff0c;如 MySQL、PostgreSQL、MongoDB …

js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj,將數組中的內容作為對象的key轉化為對象,對應的值轉換為對象對應的值

1.需求場景 哈嘍 大家好啊&#xff0c;今天遇到一個場景&#xff0c; js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj&#xff0c;將數組中的內容作為對象的key轉化為對象&#xff0c;對應的值轉換為對象對應的值 數組對象中某個屬性的值&#xff0c;轉…

元宇宙現已開放!

在 2023 年 11 月 3 日 The Sandbox 首個全球創作者日上&#xff0c;The Sandbox 聯合創始人 Arthur Madrid 和 Sebastien Borget 宣布元宇宙已開放&#xff0c;已創作完整體驗的 LAND 持有者可以自行將體驗發布至 The Sandbox 地圖上。 精選速覽 LAND 持有者&#xff1a;如果…

在JVM中 判定哪些對象是垃圾?

目錄 垃圾的條件 1、引用計數法 2、可達性分析 3、強引用 4、軟引用 5、弱引用 6、虛引用 判斷垃圾的條件 在Java虛擬機&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器負責管理內存&#xff0c;其中的垃圾收集算法用于確定哪些對象是垃圾&#xff0c;可以被回收…

VBA即用型代碼手冊之工作薄的關閉保存及創建

我給VBA下的定義&#xff1a;VBA是個人小型自動化處理的有效工具。可以大大提高自己的勞動效率&#xff0c;而且可以提高數據的準確性。我這里專注VBA,將我多年的經驗匯集在VBA系列九套教程中。 作為我的學員要利用我的積木編程思想&#xff0c;積木編程最重要的是積木如何搭建…

[Latex] Riemann 問題中的激波,接觸間斷,膨脹波的 Tikz 繪圖

Latex 代碼 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定義組件學習

文章目錄 創建自定義組件頁面和自定義組件生命周期自定義組件和頁面的區別頁面生命周期(即被Entry修飾的組件)組件生命周期(即被Component修飾的組件) Builder裝飾器&#xff1a;自定義構建函數按引用傳遞參數按值傳遞參數 BuilderParam裝飾器&#xff1a;引用Builder函數 這個…

Python 將列表拼接為一個字符串,Python join

目錄 join方法的源碼&#xff1a; 列表數據為字符串 列表數據為數字 三引號也可以使用join join方法的源碼&#xff1a; def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos應用開發者高級認證考試部分答案

1只要使用端云一體化的云端資源就需要支付費用&#xff08;錯&#xff09; 2所有使用Component修飾的自定義組件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函數。&#xff08;錯&#xff09; 3 HarmonyOS應用可以兼容OpenHarmony生態&#xff08;對&#…

一文讀懂如何安全地存儲密碼

目錄 引言 明文存儲 基本哈希存儲 加鹽哈希存儲 適應性哈希算法 密碼加密存儲 小結 引言 密碼是最常用的身份驗證手段&#xff0c;既簡單又高效。密碼安全是網絡安全的基石&#xff0c;對保護個人和組織信息的安全具有根本性的作用。然而有關密碼泄漏的安全問題一再發生…

生物動力葡萄酒和有機葡萄酒一樣嗎?

農業維持了數十萬年的文明&#xff0c;但當人類以錯誤的方式過多干預&#xff0c;過于專注于制造和操縱產品時&#xff0c;農業往往會失敗。如果我們的目標是獲得最高質量的收成&#xff0c;并長期堅持我們的做法&#xff0c;我們就必須與土地打交道。 當我們開始尋找生物動力…

應用內測分發平臺如何上傳應用包體?

●您可免費將您的應用&#xff08;支持蘋果.ios安卓.apk文件&#xff09;上傳至咕嚕分發平臺&#xff0c;我們將免費為應用生成下載信息&#xff0c;但咕嚕分發將會對應用的下載次數進行收費&#xff08;每個賬號都享有免費贈送的下載點數以及參加活動的贈送點數&#xff09;&a…

UVA1025 城市里的間諜 A Spy in the Metro

UVA1025 城市里的間諜 A Spy in the Metro 題面翻譯 題目大意 某城市地鐵是一條直線&#xff0c;有 n n n&#xff08; 2 ≤ n ≤ 50 2\leq n\leq 50 2≤n≤50&#xff09;個車站&#xff0c;從左到右編號 1 … n 1\ldots n 1…n。有 M 1 M_1 M1? 輛列車從第 1 1 1 站開…

【電路筆記】-分壓器

分壓器 文章目錄 分壓器1、概述2、負載分壓器3、分壓器網絡4、無功分壓器4.1 電容分壓器4.2 感應分壓器 5、總結 有時&#xff0c;需要精確的電壓值作為參考&#xff0c;或者僅在需要較少功率的電路的特定階段之前需要。 分壓器是解決此問題的一個簡單方法&#xff0c;因為它們…

【Vue】filter的用法

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

在vscode下將ipynb文件轉成pdf的方法

正常情況下&#xff0c;可以在vscode的ipynb界面點擊上面的三個點&#xff0c;里面有export&#xff0c;可以選擇直接輸出html和pdf&#xff0c;但是需要latex&#xff0c;由于按扎u安裝麻煩&#xff0c;所以我換了一種方法。 ----------------------------------------------…

記一次docker服務啟動失敗解決過程

環境&#xff1a;centos 7.6 報錯&#xff1a;start request repeated too quickly for docker.service 由于服務器修復了內核漏洞&#xff0c;需要重啟&#xff0c;沒想到重啟后&#xff0c;docker啟動失敗了 查看狀態 systemctl status docker如下圖 里面有一行提示&…

網絡互聯與IP地址

目錄 網絡互聯概述網絡的定義與分類網絡的定義網絡的分類 OSI模型和DoD模型網絡拓撲結構總線型拓撲結構星型拓撲結構環型拓撲結構 傳輸介質同軸電纜雙絞線光纖 介質訪問控制方式CSMA/CD令牌 網絡設備網卡集線器交換機路由器總結 IP地址A、B、C類IP地址特殊地址形式 子網與子網掩…