django之auth模塊(用戶認證)
一、auth模塊簡介
auth模塊是django框架自帶的功能模塊,是對登錄認證方法的一種封裝,之前我們獲取用戶輸入的用戶名及密碼后需要自己從user表里查詢有沒有用戶名和密碼符合的物件,而有了auth模塊之后就可以很輕松的去驗證用戶的登錄資訊是否存在于auth_user表中(執行完遷移命令之后在資料庫中自動生成的表),除此之外,auth還對session做了一些封裝,方便我們校驗用戶是否已登錄,
二、相關的模塊、物件、裝飾器匯入
from django.contrib import auth # 匯入auth模塊 from django.contrib.auth.models import User # 匯入auth_user表物件 from django.contrib.auth.decorators import login_required # 校驗用戶是否登陸的裝飾器
三、auth模塊常用方法
1、創建用戶
User.objects.create(username=username, password=password) # 創建普通用戶,密碼不加密(不推薦使用) User.objects.create_user(username=username, password=password) # 創建普通用戶,密碼加密(推薦使用) User.objects.create_superuser(username=username, password=password, email='[email protected]') # 創建超級用戶,但是必須填寫郵箱事項,要不報錯
2、校驗用戶名和密碼是否正確
auth.authenticate(request, username=username, password=password) # 用戶名密碼正確回傳的是用戶物件,錯誤回傳None
3、保存用戶登陸狀態
auth.login(request, user_obj) """只要執行了此代碼,之后在任意可以獲取到request物件的地方,都可以通過request.user獲取到當前登錄的用戶物件"""
4、如何判斷當前用戶是否登陸以及如何獲取當前登陸用戶物件
request.user.is_authenticated() # 判斷是否登陸 request.user # 登陸用戶物件
5、校驗用戶是否登陸,未登錄情況下自動跳轉到自定義的登錄界面
# 區域配置
from django.contrib.auth.decorators import login_required # 匯入校驗用戶是否登陸裝飾器 # 區域配置@login_required(login_url='/login/') # 區域配置時,需要指定用戶驗證未登錄時跳轉到哪個頁面def login_after01(request): return HttpResponse('我是login_after01頁面')
# 全域配置
1)在settings.py中添加以下代碼:
# 全域配置 LOGIN_URL = '/login/'
2)views.py中這樣寫:
from django.contrib.auth.decorators import login_required @login_required # 全域配置時,只需要在組態檔中加入全域代碼,這里不需要指定跳轉頁面 def login_after01(request): return HttpResponse('我是login_after01頁面')
PS:如果全域和區域都配置,則優先執行區域配置
6、檢驗密碼、修改密碼
# 先校驗舊密碼是否正確 request.user.check_password(old_password) # 回傳的是布林值 # 修改密碼 request.user.set_password(new_password) request.user.save() # 一定要保存
7、注銷登陸
auth.logout(request)
四、根據auth常用方法寫個栗子:使用auth模塊寫一個注冊、登陸、修改密碼、注銷登陸功能
此例使用全域配置,未登錄自動跳轉到 '/login' 界面
from django.contrib import auth # 匯入auth模塊 from django.contrib.auth.models import User # 匯入auth_user表物件 from django.contrib.auth.decorators import login_required # 校驗用戶是否登陸的裝飾器 # 注冊功能 def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # User.objects.create(username=username, password=password) # 創建普通用戶,密碼不加密(不推薦使用) User.objects.create_user(username=username, password=password) # 創建普通用戶,密碼加密(推薦使用) # User.objects.create_superuser(username=username, password=password, email='[email protected]') # 創建超級用戶,但是必須填寫郵箱事項,要不報錯 return HttpResponse('Congratulation!注冊成功!') return render(request, 'reg.html') # 登錄功能 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) # print(res) # 用戶名密碼正確回傳的是用戶物件,錯誤回傳None if user_obj: # 保存用戶登錄狀態 auth.login(request, user_obj) """只要執行了此代碼,之后再任意可以獲取到request物件的地方, 都可以通過request.user獲取到當前登錄的用戶物件""" return HttpResponse('登陸成功!') return render(request, 'login.html') # 登陸之后可以查看的頁面 @login_required def get_user(request): print(request.user) """用戶登錄成功之后,request.user拿到的就是用戶物件,沒有登錄獲取到的是匿名用戶""" print(request.user.is_authenticated) return HttpResponse('get_user頁面') # 登陸之后可以查看的頁面 @login_required def login_after01(request): return HttpResponse('我是login_after01頁面') # 登陸之后可以查看的頁面 @login_required def login_after02(request): return HttpResponse('我是login_after02頁面') # 登陸之后可以查看的頁面 @login_required def login_after03(request): return HttpResponse('我是login_after03頁面') # 修改密碼功能 @login_required def set_password(request): if request.method == 'POST': old_password = request.POST.get('old_password') new_password = request.POST.get('new_password') # 先校驗舊密碼是否正確 is_right = request.user.check_password(old_password) # 回傳的是布林值 # 再修改密碼 if is_right: request.user.set_password(new_password) request.user.save() # 一定要保存 return render(request, 'set_password.html') # 注銷功能 @login_required def logout(request): auth.logout(request) return HttpResponse('注銷成功')views.py
五、auth_user表擴展欄位(在auth_user表的基礎上)
方法:利用類的繼承
1)在models.py中定義表名和擴展欄位
from django.contrib.auth.models import User, AbstractUser # 匯入類
# 定義類,類名即為表名,自定義的表將替換auth_user內置表 class UserInfo(AbstractUser): # 擴展的欄位,盡量不要與原先表中的欄位沖突 phone = models.BigIntegerField() age = models.IntegerField()
2)在settings.py中添加以下代碼:
AUTH_USER_MODEL = 'app01.UserInfo' # 應用.表名 """django就會將userinfo表來替換auth_user表,并且之前auth模塊所有的功能不變,參照的也是userinfo表"""
擴展之前的表名和欄位:

擴展之后的表名和欄位:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236388.html
標籤:其他
