Django
內置一個 auth
模塊,幫助用戶實現註冊、登陸、註銷以及修改密碼等功能,幫助開發者省去了不少功夫python
auth_user
auth
模塊中維護用戶信息的關係模式(繼承了models.Model
), 數據庫中該表被命名爲auth_user
auth_group
auth_user_user_permissions
user.user_permissions
關聯,在數據庫中由auth_user_user_permissions
數據表維護。auth_user_groups
groups
的多對多字段, 多對多關係由auth_user_groups
數據表維護。Group對象能夠經過user_set
反向查詢用戶組中的用戶。auth_group_permissions
auth_permission
django.contrib.auth
模塊要使用Django
自帶的認證功能,首先要導入auth
模塊數據庫
from django.contrib import auth
auth
提供的方法authentioate()
django
提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要
username
和password
兩個關鍵字參數;session若是經過認證,
authentioate()
函數會返回一個User
對象;app
authentioate()
函數會在User
對象上設置一個屬性標識,這個屬性標識通過數據庫驗證用戶名和密碼;函數當咱們試圖登陸一個從數據庫中直接取出來不通過
authentioate()
的User
對象時會報錯。工具
login(request)
網站
接收一個
HttpRequest
對象,以及一個經過authentioate()
函數認證的User對象;ui實現用戶登陸功能,會在後臺爲登陸用戶生成
session
數據;url執行過
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。
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
。