Django的is_authenticated和定义Mixin 扩展类. 实现登录校验

is_authenticated

该方法能够帮助我们判断用户是否登录

is_authenticated 方法的了解:

这是 django 提供的一个用于判断用户是否登录的方法

该方法想要调用, 前面必须是 user. 拿到 user 才可以调用该方法

例如:

# is_authenticated 前面一定要是 request.user
# 或是 user
request.user.is_authenticated

用户登录:  request.user.is_authenticated 为 True
用户未登录:  request.user.is_authenticated 为 False

如果用户登录, 则该方法返回 True. 否则: 返回 False.

缺点:

如果在每个登录方法中都进行验证

则, 很多地方都需要添加这些代码,

例如, 下面的情况:

class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""

        # 判断用户是否登录: 
        if request.user.is_authenticated():
            # 如果登录, 则正常返回该页面数据
        else:
            # 否则, 进入登录页面,让用户进行登录

备注: 我们在使用时, 可以使用 is_authenticated 也可以使用 is_authenticated( ) 都是可以的. 大家可以思考一下为什么...

注意:

上面的写法虽然看起来问题不大, 但是需要注意, 如果有多个接口

都需要进行上面的验证, 那么在每个函数中都添加如上的判断吗?

显然是不合适的.

那么我们该怎样解决呢?

定义 Mixin 扩展类. 实现登录校验

该代码定义的是 Mixin 扩展类:

from django.http import JsonResponse

def my_decorator(func):
    '''自定义的装饰器:判断是否登录'''
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated:
            # 如果用户登录, 则进入这里,正常执行
            return func(request, *args, **kwargs)
        else:
            # 如果用户未登录,则进入这里,返回400的状态码
            return JsonResponse({'code':400,
                                 'errmsg':'请登录后重试'})
    return wrapper


class LoginRequiredMixin(object):
    '''自定义的Mixin扩展类'''

    # 重写的 as_view 方法
    @classmethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        # 调用上面的装饰器进行过滤处理: 
        return my_decorator(view)

 

posted @ 2020-05-19 08:55  Tracydzf  阅读(647)  评论(0编辑  收藏  举报