django-rest-framework的认证流程源码简单解析

lihao-like 2018-08-14 原文

django-rest-framework的认证流程源码简单解析

  在编写购物车功能时需要实现未登录状态下的添加购物车功能,但是django的认证在进入视图函数前就会进行,如果未登陆的话请求根本进不到接口(在使用

JWT验证的时候),由于前段会携带JWT字段但却没有携带值,导致认证功能报错。

  那么如何解决呢?

  perform_authentication()这个函数是在程序进入视图函数前运行的

def initial(self, request, *args, **kwargs):
        self.format_kwarg = self.get_format_suffix(**kwargs)
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme
        self.perform_authentication(request)  #
        self.check_permissions(request) 
        self.check_throttles(request) 

  这个函数 return request.user

  这里的request.user是个property装饰的方法

@property
    def user(self):
        if not hasattr(self, '_user'):
            self._authenticate()
        return self._user

  

def _authenticate(self):
        for authenticator in self.authenticators:
            try:
                user_auth_tuple = authenticator.authenticate(self) #重点
            except exceptions.APIException:
                self._not_authenticated()
                raise

            if user_auth_tuple is not None:
                self._authenticator = authenticator   #验证用户的功能
                self.user, self.auth = user_auth_tuple
                return

        self._not_authenticated()

  其中的self.authenticators是我们在视图类中定义的authentication_classes,即身份认证类。

  最终,认证类中的authenticate方法会返回一个用户对象给request.user,我们的用户就是这么获得的。

  而在后面的 self.check_permissions(request) 方法,是进行权限验证的,最终在我们定义的权限类中的 has_permission 方法返回

 return request.user and request.user.is_authenticated

  言归正传,如果想实现在不登录下的进入视图,那么我们只需要重写perform_authentication()方法,即

 def perform_authentication(self, request):
        """
        重写父类的用户验证方法,不在进入视图前就检查JWT
        """
        pass

  之后再在视图函数中判断用户是否登录

try:
    user = request.user
except Exception as e:
    user = None
if user and user.is_authenticated:
    """如果用户登录的操作"""
else:
    """如果用户没登录的操作"""

 

以上

 

 

 

 

 

 

 
发表于 2018-08-14 17:26 roseli 阅读() 评论() 编辑 收藏

 

版权声明:本文为lihao-like原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lihao-like/p/9475986.html

django-rest-framework的认证流程源码简单解析的更多相关文章

  1. Python 入门之基本数据类型

    Python 入门之基本数据类型 为什么我要学习Python这门语言呢?其实很简单,我想拓展技术面的同时,尝试 […]...

  2. python 之禅

    python 之禅  1.Beautiful is better than ugly.  优美胜于丑陋(Pyt […]...

  3. pickle模块及其API

    模块:pickle 所包含API列表:    pickle.dumps : 把任意对象序列化成一个bytes […]...

  4. Python 集合set()添加删除、交集、并集、集合操作详解

    Python 集合set()添加删除、交集、并集、集合操作详解     在Python set是基本数据类型的 […]...

  5. 小白学python-day06-

    今天是day06,以下是学习内容总结: 但行努力,莫问前程。 ——— […]...

  6. python 一篇搞定所有的异常处理

    一:什么是异常?   异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。   一般情况下, […]...

  7. 【Python】文件操作

    文件的类型 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是数据存储的一种形式 文件展现形态 […]...

  8. Python多线程笔记(二)

    Lock对象 原语锁(互斥锁)是一个同步原语,状态是”已锁定”或者”未锁定 […]...

随机推荐

  1. 【开发记录】微信小游戏开发入门——俄罗斯方块

    叨叨   我在前一阵子,打算做一个微信小游戏,当然是单机的,只是为了了解小游戏开发的过程,最终选择了俄罗斯方块 […]...

  2. 大学生身边痛点的缝隙及过分的苛求追求极致效果行不行的通的看法

    大学生身边痛点 1 大学生兼职难 许多同学因为生活费不够或者想买一些比较昂贵的东西想去找一份兼职来改善一下自己 […]...

  3. 找不到显示桌面的快捷方式怎么办|显示桌面的快捷方式找不到解决方法|显示桌面代码|

    找不到显示桌面的快捷方式怎么办|显示桌面的快捷方式找不到解决方法|显示桌面代码| 新建记事本把一下代码拷进去, […]...

  4. hightec的eclipse运行错误解决

    操作系统:win10专业版(本来是家庭普通版,使用了一个序列号升级到了专业版)出问题的软件:hightec的E […]...

  5. HTML中的字体颜色 – 破茧化蝶

    HTML中的字体颜色 1.关于字体颜色的使用方法:<font color=颜色代码 size=字号 fa […]...

  6. Java集合类详解 – Jay36

    Java集合类详解 Collection├List│├LinkedList│├ArrayList│└Vecto […]...

  7. 干货:ANR日志分析全面解析

    业界在如何解决和避免ANR问题上已经有较多博文,但是在如何分析ANR日志上很少有全面完备的阐述。本文系统总结了 […]...

  8. 冒泡排序算法分析 – JAVA版

    工作这么久了,由于本人非科班出身,对于一些基础的算法理解一致不是很透彻。以冒泡算法为例,每次复习后,过段时间总 […]...

展开目录

目录导航