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. Django 配置JWT认证方式

    1. 安装 rest_framework + djangorestframework_simplejwt 安装 […]...

  2. python深拷贝和浅拷贝之简单分析

    title: python 深拷贝和浅拷贝 tags: python,copy,deepcopy gramma […]...

  3. unittest报告出现dict() -> new empty dictionary错误解决办法

    unittest报告出现dict() -> new empty dictionary错误解决办法 201 […]...

  4. 自动化冒烟测试 Unittest , Pytest 哪家强?

    前言:之前有一段时间一直用 Python Uittest做自动化测试,觉得Uittest组织冒烟用例比较繁琐, […]...

  5. day-7 一个简单的决策树归纳算法(ID3)python编程实现

        本文介绍如何利用决策树/判定树(decision tree)中决策树归纳算法(ID3)解决机器学习中的 […]...

  6. python中的线程

    1.线程的创建 1.1 通过thread类直接创建 import threading import time […]...

  7. Python -pycharm光标变粗解决办法!!

    今天在写代码的时候,突然光标变粗了,然后按del一直在删除左右移动也不好使,想打新的字,直接把原来的改掉了,这 […]...

  8. 爬虫学习笔记(三)requests模块使用

    前面在说爬虫原理的时候说了,就写代码自动化的获取数据,保存下来数据,那怎么写代码来请求一个网址,获取结果呢,就 […]...

随机推荐

  1. 华为交换机打开或者关闭告警信息命令

    打开 terminal logging terminal monitor terminal trapping […]...

  2. Java锁

    Java锁悲观锁概述认为自己在使用数据的时候一定有别的线程跟修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁适用场景适合写操作多的场景,先加锁可以保证写...

  3. 电脑Wlan不能上网的解决办法

    Step1: 断开连接,再连接。反复试几次。  如果没有解决进行下一步 Step2:重启电脑。如果没有解决,进 […]...

  4. 如何查看pip安装包的所有版本;以及ipython的安装

    安装ipython很简单,直接使用pip就行 比如mac环境下:pip install ipython;提示安 […]...

  5. 我们工作到底为了什么(这篇文章很重要)

    我们工作到底为了什么(这篇文章很重要) HP大中华区总裁孙振耀退休感言 :  如果这篇文章没有分享给你,那是我 […]...

  6. 学习笔记之Python人机交互小项目一:名字管理系统

    2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施。与往年不同的是, […]...

  7. 尝试做自己的WebForm设计器。

    由于工作中自己开发的工作流产品中需要一个用户能够自定义WebForm的表单设计器,在我接手这个项目之前的东西, […]...

  8. UTC 时间转换 All In One

    UTC 时间转换 All In One 摄氏度 ℃ & 华氏 ℉ UTC 时间转换 All In On […]...

展开目录

目录导航