- Django 的用戶認證系統提供了方法
request.user.is_authenticated()來判斷用戶是否登錄. - 通過登錄驗證這個方法返回 True. 否則: 返回 False.
class UserInfoView(View):
"""用戶中心"""
def get(self, request):
"""提供個人信息界面"""
# 進行判斷: 是否登錄驗證
if request.user.is_authenticated():
# 如果登錄, 則正常加載用戶中心頁面
return render(request, 'user_center_info.html')
else:
# 否則, 進入登錄頁面,進行登錄
return redirect(reverse('users:login'))
- Django 的用戶認證系統提供了
login_required這個裝飾器來判斷用戶是否登錄- 內部封裝了
is_authenticate - 位置:
django.contrib.auth.decorators
- 內部封裝了
- 通過登錄驗證則進入到視圖內部,執行視圖邏輯
- 未通過登錄驗證則被重定向到
LOGIN_URL配置項指定的地址- 所以在使用該裝飾器時, 我們需要在 dev.py 文件中, 添加如下設置:
LOGIN_URL = '/login/' - 登錄用戶才能訪問, 否則訪問的路徑
- 所以在使用該裝飾器時, 我們需要在 dev.py 文件中, 添加如下設置:
login_required用法
- 直接裝飾函數視圖
- as_view() 方法是將類視圖轉成的函數視圖, 要想使用 login_required 裝飾器 裝飾類視圖,可以間接的裝飾 as_view() 方法的返回值
# 在子路由中, 給 as_view() 函數,添加裝飾器:
url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info'),
- 定義 View 子類: 封裝 login_required 裝飾器
# 定義工具類: LoginRequired
# 繼承自: View
class LoginRequired(View):
"""驗證用戶是否登陸的工具類"""
# 重寫 as_view() 函數
# 在這個函數中, 對 as_view 進行裝飾
@classmethod
def as_view(cls, **initkwargs):
# 我們重寫這個方法, 不想做任何的修改操作
# 所以直接調用父類的 super().as_view() 函數.
view = super().as_view()
return login_required(view)
我們自己的類視圖, 讓其繼承自 LoginRequired
class UserInfoView(LoginRequired):
"""用戶中心接口"""
def get(self, request):
"""提供個人信息界面"""
return render(request, 'user_center_info.html')
-
不推薦:工具類直接依賴於視圖類 View,所以復用性相對來說很差.
3.使其繼承自 object.
# 我們定義的工具類:
# 繼承自 object
class LoginRequired(object):
"""驗證用戶是否登陸的工具類"""
# 重寫該函數:
@classmethod
def as_view(cls, **initkwargs):
# 調用父類的 as_view() 方法
view = super().as_view()
# 添加裝飾行為:
return login_required(view)
定義我們自己的類視圖, 需要讓它繼承自: 工具類 + View
class UserInfoView(LoginRequired, View):
"""用戶中心"""
def get(self, request):
"""提供個人信息界面"""
return render(request, 'user_center_info.html')
升級改造,推薦:
- 將工具類轉移到 utils 工具類文件中
# 導入:
from django.contrib.auth.decorators import login_required
# 添加擴展類:
# 因為這類擴展其實就是 Mixin 擴展類的擴展方式
# 所以我們起名時, 最好也加上 Mixin 字樣, 不加也可以.
class LoginRequiredMixin(object):
"""驗證用戶是否登錄的擴展類"""
@classmethod
def as_view(cls, **initkwargs):
# 調用父類的 as_view() 函數
view = super().as_view()
return login_required(view)
在 users.views.py 文件中, 引入代碼:
# 導入
from meiduo_mall.utils.views import LoginRequiredMixin
# 添加用戶中心類:
class UserInfoView(LoginRequiredMixin, View):
"""用戶中心"""
def get(self, request):
"""提供個人信息界面"""
return render(request, 'user_center_info.html')
