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'),
  2. 定义 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')

转载于:https://www.cnblogs.com/oklizz/p/11209368.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果用户登录后访问其他页面时仍然显示未登录状态,可能有以下几种情况需要检查: 1. 请确保在登录后您已经正确设置了用户的身份验证状态。在 Django 中,可以使用 `login()` 函数来设置用户的身份验证状态。例如: ```python from django.contrib.auth import authenticate, login def my_view(request): # your view code here user = authenticate(request, username='my_username', password='my_password') if user is not None: login(request, user) ``` 在这个例子中,我们使用 `authenticate()` 函数来验证用户用户名和密码,然后使用 `login()` 函数将用户的身份验证状态记录到会话中。 2. 确保您在视图函数中正确地使用了 `@login_required` 装饰器。如果您的视图函数需要访问用户的身份验证状态,请确保您在视图函数中使用 `request.user` 来获取当前用户对象。例如: ```python from django.contrib.auth.decorators import login_required @login_required def my_view(request): # your view code here user = request.user ``` 3. 检查您的登录页面是否正确地将用户的身份验证状态存储在会话中。在 Django 中,默认情况下,用户的身份验证状态将存储在会话中。如果您在登录页面中使用了自定义的身份验证逻辑,请确保将用户的身份验证状态正确地存储在会话中。例如: ```python from django.contrib.auth import authenticate, login def my_login_view(request): # your login view code here user = authenticate(request, username='my_username', password='my_password') if user is not None: login(request, user) request.session['user_authenticated'] = True ``` 在这个例子中,我们使用 `request.session` 来存储用户的身份验证状态。 希望这些提示能够帮助您找到问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值