zoukankan      html  css  js  c++  java
  • 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')
    
  • 相关阅读:
    classpath详解
    xml详解
    pojo、po、dto、dao、bo区别
    事务的四种隔离级别
    spring相关知识点易错
    Orm
    100+个Java项目视频教程+源码+笔记,项目经验不用愁了!
    使用TM1629A芯片驱动米字数码管
    关于安装airflow遇到的问题
    Semver(语义化版本号)扫盲
  • 原文地址:https://www.cnblogs.com/oklizz/p/11209368.html
Copyright © 2011-2022 走看看