前言
在開發一個網站時,經常會用到用戶的注冊和登陸相關的賬號管理功能,auth模塊是Django提供的標准權限管理系統,可以提供用戶身份認證, 用戶組和權限管理。
像用戶注冊、用戶登錄、用戶認證、注銷、修改密碼等功能都不需要我們去開發,這些功能django已經早就設計好了。
auth模塊
當我們執行makemigrations和migrate數據庫遷移的時候,會自動新增一個auth_user表,用戶存放用戶賬號密碼等相關信息。
創建超級管理員用戶python manage.py createsuperuser
的時候,會在表里面寫入管理員的賬號、密碼、郵箱等相關信息,如下圖
這里我的賬號是root,密碼是root,很顯然存在數據庫的密碼不是明文的,而是加密后的
認證authenticate()
前面注冊的root賬號是在auth_user表里面,所以需導入對應的User表,這里密碼不是明文的,有個專門的方法authenticate
判斷是否登錄成功
from django.contrib.auth import authenticate
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
# 輸入正確賬號,密碼,user返回root用戶對象
>>> user=authenticate(username='root',password='root')
>>> user
<User: root>
# 輸入錯誤的密碼,user返回為空
>>> user=authenticate(username='root',password='xxxx')
>>> user
>>>
authenticate認證用戶的密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None
注冊create_user
注冊用戶可以直接使用create_user
方法,非常方便,前面說過密碼是加密后的,這里使用create_user方法新增用戶會自動加密存儲到數據庫了
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
# 新增用戶test.密碼test
>>> user1=User.objects.create_user(username='test',password='test',email='283340479@qq.com')
>>> user1.save()
>>>
save保存后,數據庫查看auth_user表新增成功
修改密碼set_password
當我們需要修改密碼的時候,可以用set_password方法,該方法不驗證用戶的身份,直接修改,一般在已經登陸的時候,修改密碼使用
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
>>> user=authenticate(username='test',password='test')
# 設置新密碼
>>> user.set_password('123456')
>>> user.save()
# 修改成功后使用新密碼登陸
>>> user=authenticate(username='test',password='test')
>>> user.set_password('123456')
當密碼錯誤的時候,user返回為空,使用user.set_password('123456')會直接拋異常,所以修改密碼的時候,一般先判斷下
>>> user=authenticate(username='test',password='test')
# 密碼不對,user為空拋異常
>>> user.set_password('123456')
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'set_password'
# 加判斷
>>> user=authenticate(username='test',password='test')
>>> user
>>> if user is not None:
... user.set_password('123456')
... user.save()
...
>>>
登陸login
用戶登陸功能,有給專門的login函數,它可以在session中添加SESSION_KEY
from django.contrib.auth import login
login(request, user)
傳2個參數,request和user參數,這里不需要傳密碼,需配合authenticate(username=username, password=password)
先校驗賬號和密碼是否成功
login(request, user)
登陸之前還有個is_active
判斷, is_active是判斷用戶是否可以用,當它為is_active的時候(True),用戶可以正常登陸,當is_active為0(False),用戶不可用,相當於拉入黑名單
from django.contrib.auth import login, authenticate
def login_view(request):
‘’‘session登陸'''
user = authenticate(username='test', password='test')
if user is not None:
if user.is_active:
login(request, user)
退出登陸
logout會清除request中的user信息, 並刷新session
from django.contrib.auth import logout
def logout_view(request):
'''退出登陸'''
logout(request)