Django內置的用戶認證
Django 內置一個 auth 模塊,幫助用戶實作注冊、登錄、注銷以及修改密碼等功能,幫助開發者省去了很多功夫
用于認證的資料表
auth_user- User是
auth模塊中維護用戶資訊的關系模式(繼承了models.Model), 資料庫中該表被命名為auth_user
- User是
auth_groupauth_user_user_permissions- User和Permission通過多對多欄位
user.user_permissions關聯,在資料庫中由auth_user_user_permissions資料表維護,
- User和Permission通過多對多欄位
auth_user_groups- User物件中有一個名為
groups的多對多欄位, 多對多關系由auth_user_groups資料表維護,Group物件可以通過user_set反向查詢用戶組中的用戶,
- User物件中有一個名為
auth_group_permissionsauth_permission
django.contrib.auth模塊
使用
要使用Django自帶的認證功能,首先要匯入auth模塊
from django.contrib import auth
auth提供的方法
-
authentioate()提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要
username和password兩個關鍵字引數;如果通過認證,
authentioate()函式會回傳一個User物件;authentioate()函式會在User物件上設定一個屬性標識,這個屬性標識經過資料庫驗證用戶名和密碼;當我們試圖登錄一個從資料庫中直接取出來不經過
authentioate()的User物件時會報錯, -
login(request)接收一個
HttpRequest物件,以及一個通過authentioate()函式認證的User物件;實作用戶登錄功能,會在后臺為登錄用戶生成
session資料;執行過
login()方法的用戶物件,就能通過request.user拿到當前登錄的用戶物件,從而取出用戶的相關資訊,否則取得的將是一個匿名用戶物件AnonymounsUser Object, -
logout(request)接收一個
HttpRequest物件,無回傳值;當呼叫函式時,當前請求的session資訊全部被清除;
即使當前用戶沒有登錄,呼叫該函式也不會報錯,
-
login_required()
auth模塊提供的一個裝飾器工具,能夠便捷地為某個視圖添加登錄校驗,若用戶沒有登錄,則默認會跳轉到
accounts/login/,并傳遞當前訪問url絕對路徑,自定義跳轉路徑,只需在
settings.py中添加:LOGIN_URL = '/login/'from django.contrib.auth.decorators import login_required @login_required def home(request): pass
User物件的方法
-
is_authentioated()檢查用戶是否已經通過了認證;
如果是通過
auth函式回傳的真實的User物件,回傳值則為True; -
create_superuser()
該方法用于創建一個超級用戶,接收
username、password兩個必要引數,效果與執行python manage.py createsuperuser等同, -
create_user()
一般情況
create_superuser()方法很少使用,最常使用的是create_user()方法,它將會創建一個普通用戶,常應用于注冊視圖中,創建用戶所需欄位,應與
auth_user資料表中欄位對應, -
set_password[password]
該方法用于修改密碼,接收要新密碼作為引數,最后一定要執行
save()方法保存,否則無效, -
check_password[password]
檢查登錄用戶密碼是否正確,需要當前請求用戶的密碼;
密碼正確回傳 True,否則回傳 False,
User物件屬性
-
is_staff
判斷用戶是否擁有網站的管理權限
-
is_active
判斷是否允許用戶登錄,
設定為False時可以不用洗掉用戶來禁止用戶登錄,
auth模塊拓展
由于 auth 模板中 auth_user 資料表欄位是固定的,因此當我們使用 auth 模塊,想要添加額外的欄位時,就需要對其進行拓展,
拓展的方法:
-
模型中新增一個表,與
auth_user表一對一關聯 -
繼承內置的
AbstractUser類:常用-
模型
models.py中新建一個類,繼承自AbstractUser:from django.contrib.auth.models import User, AbstractUser # 匯入 AbstractUser 類 class UserInfo(AbstractUser): """ 繼承 AbstractUser 新增欄位:phone、addr """ phone = models.CharField(max_length=11, verbose_name='手機號碼') addr = models.CharField(max_length=128, verbose_name='家庭地址') -
配置
settings.py新增的類繼承
AbstractUser,拓展后將會覆寫auth_user表,因此需要配置settings,使默認認證知道要使用哪種表認證,# settings.py # 在最后添加如下代碼 AUTH_USER_MODEL = 'app名.新增的類名' AUTH_USER_MODEL = 'app.UserInfo' # 示例 -
遷徙資料表
python manage.py makemigrations python manage.py migrate -
創建用戶
拓展
auth模塊后,使用的不再是原來auth_user表,而是新表app.UserInfo表,因此在創建用戶時應該注意,# 拓展之前 from django.contrib.auth.models import User user_obj = User.objects.create_user(username='lila', password='1234') # 拓展之后 from app.models import UserInfo user_obj = UserInfo.objects.create_user(username='lila', password='1234')
- 若已經遷徙了模型,拓展
auth模塊時,需要將migrations檔案夾下檔案(如:0001_initial.py檔案洗掉),否則會報ValueError: Related model u'app.model' cannot be resolved, - 若還沒有遷徙模型,那么正常執行即可,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137136.html
標籤:Python
下一篇:06.Django-快取
