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连载24-函数list&read&seek

    一、 函数list (1)定义:用打开的文件作为参数,把文件内的每一行内容作为一个元素 (2)格式:list( […]...

  2. Python 网络编程-TCP服务端基础篇(一)简单的发送和接收

    #Python 网络编程-TCP服务端基础篇(一)简单的发送和接收##TCP服务端基本流程图     TCP服 […]...

  3. Google 开源的 Python 命令行库:初探 fire

    作者:HelloGitHub-Prodesire HelloGitHub 的《讲解开源项目》系列,项目地址:h […]...

  4. 翻译 | 30个 Python3 的最佳实践,技巧和窍门

    1、使用 Python3 如果你关注 Python 的话,应该会知道 Python 2 已经于今年(2020 […]...

  5. Django学习(2)数据宝库

      数据库是一所大宝库,藏着各种宝贝。一个没有数据库的网站,功能有限。在Django中,支持的数据库有以下四种 […]...

  6. Python Weekly 422

    新闻 Python 采用12个月作为发布周期 链接: https://mail.python.org/arch […]...

  7. python工业互联网应用实战15-前后端分离模式1

    python工业互联网应用实战15-前后端分离模式1 通过本章节内容,我们阐述了如何实现服务端与客户端分离的写 […]...

  8. python 文件和目录操作题库

    1. 把一个目录下所有的文件删除,在所有的目录下新建一个a.txt的文件,并在文件下写入”pyth […]...

随机推荐

  1. @@trancount什么意思(重要)

    @@trancount什么意思 https://www.cnblogs.com/monian/archive/ […]...

  2. Oracle和可视化视图工具教程

    Oracle数据库安装教程 作者:黑小子-余 Qq:2931445528 微信:Y2931445528 可以找 […]...

  3. HTML – 表格 / 列表 / 区块 / 表单

    HTML表格 表格由<table>标签来定义,每个表格均有若干行(由<tr>标签定义) […]...

  4. HTTP 请求方法

    HTTP 请求方法 根据 HTTP 标准,HTTP 请求可以使用多种请求方法。 HTTP1.0 定义了三种请求 […]...

  5. Java基本概念

    Java开发平台、Java重要术语、Java语言特点、Java开发步骤 Java语言 Java语言 语言基础- […]...

  6. [国家集训队] 礼物

    Description 给定P,求\(\Pi_{i=1}^m C_{n-w_1-w_2-…-w_{ […]...

  7. NPOI用Excel模板导出Excel文件(一)基本操作

    最近接触了用c#导出Excel文件的一些操作。 使用NPOI的优势是,开源,操作灵活,不需要下载OFFICE软 […]...

  8. shell脚本之sed详解 (sed命令 , sed -e , sed s/ new / old / … )

    (一)   Sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。vi中的正则表达式命令在se […]...

展开目录

目录导航