ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-05-19 09:08:55  阅读:341  来源: 互联网

标签:authenticated 登录 request 用户 Django user Mixin view


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)

 

标签:authenticated,登录,request,用户,Django,user,Mixin,view
来源: https://www.cnblogs.com/tracydzf/p/12914842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有