一. 認證系統概要 create_user 創建用戶 authenticate 驗證登錄 login 記住用戶的登錄狀態 logout 退出登錄 is_authenticated 判斷用戶是否登錄 login_required 判斷用戶是否登錄的裝飾器 二. 創建用戶和驗證登錄 1. 當用戶註冊的時 ...
一. 認證系統概要
- create_user 創建用戶
- authenticate 驗證登錄
- login 記住用戶的登錄狀態
- logout 退出登錄
- is_authenticated 判斷用戶是否登錄
- login_required 判斷用戶是否登錄的裝飾器
二. 創建用戶和驗證登錄
當用戶註冊的時候用
create_user(username,password,email)
預設情況下is_active=True,is_staff=False,is_superuser=False
。- 底層將password用hash演算法加密之後存儲到資料庫中。
當用戶登錄的時候用
authenticate(username=username,password=password)
驗證登錄,判斷資料庫中是否存在用戶輸入的賬號和密碼,返回一個user對象。- 底層將password用hash演算法加密後和資料庫中password進行對比。
三. 記住用戶的登錄狀態
當用戶登錄的時候用login(request,user)
來記住用戶的登錄狀態,預設將用戶的id存儲在session中。
- login有兩個參數一個是request,一個是user,user的來源必須是
authenticate
返回的。也就是說用login
之前必須先調用authenticate
。
四. 退出登錄
當用戶註銷的時候用logout(request)
,只需要一個參數request。
五. 判斷用戶是否登錄
- 在後臺的視圖函數里可以用
request.user.is_authenticated()
判斷用戶是否登錄 - 在前端頁面中可以用
{% if user.is_authenticated %}{% endif %}
判斷用戶是否登錄
六. 裝飾器判斷用戶是否登錄
- 基於普通的視圖函數可以使用
@login_required
來裝飾,但是基於類視圖的get和post方法不能直接使用@login_required
來裝飾。 - 基於類視圖的裝飾有以下三種:
第一種:在urls文件中導入
login_requtred
,直接裝飾as_view()
函數url(r'^$', login_required(UserInfoView.as_view()), name='user')
第二種:自定義一個
LoginRequiredView
類繼承View
類,重寫as_view()
函數,並裝飾as_view()
函數的返回值。 我們自定義的視圖類就不需要再繼承View
類,直接繼承LoginRequiredView
類就好了。class LoginRequiredView(View): @classmethod def as_view(cls, **initkwargs): # 調用View類中as_view方法 view = super(LoginRequiredView, cls).as_view(**initkwargs) # 調用login_required裝飾器 return login_required(view)
第三種:自定義一個
LoginRequiredMixin
類,重寫as_view()
函數,調用View
中的as_view()
函數,並裝飾as_view()
函數的返回值。 我們自定義的視圖類需要先繼承LoginRequiredMixin
類再繼承View
類。這種方式的關鍵點在於:多繼承中super()
的調用順序和__mro__
的順序是一樣的。class LoginRequiredMixin(object): @classmethod def as_view(cls, **initkwargs): # 調用View類中as_view方法 view = super(LoginRequiredMixin, cls).as_view(**initkwargs) # 調用login_required裝飾器 return login_required(view)