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')
posted @ 2019-07-18 19:04  太虚真人  阅读(1101)  评论(0编辑  收藏  举报