is_authenticate 和 login_required判斷用戶是否登錄


  • 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/'
    • 登錄用戶才能訪問, 否則訪問的路徑

login_required用法

  1. 直接裝飾函數視圖
    • as_view() 方法是將類視圖轉成的函數視圖, 要想使用 login_required 裝飾器 裝飾類視圖,可以間接的裝飾 as_view() 方法的返回值
# 在子路由中, 給 as_view() 函數,添加裝飾器: 
url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info'),
  1. 定義 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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM