Django-restframework 源码分析之认证

前言

最近学习了 django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部分方法还不太清楚),于是想详细的总结一下当来一个请求时,在该框架里面是如何执行的?

启动项目时

昨天在调试django时,发现在 APIView 中打的断点没有断下来,而是打在 View 中的断点断下来了,调试了很多次,最后发现,在 django 项目启动时,会首先加载 urls 中的文件,执行 views 中类的 as_view方法,其实是继承自 APIView 的,APIView 继承自 django 原生 View 的as_view 方法。

里面一个参数叫 pattern_name,对应的值是admin:auth_group_change,如下图所示:

目前还不清楚这里面的具体流程是什么,但是并不妨碍阅读之后的源码,在这只要清楚一点,在 Django 项目启动时,路由所对应的CBV里面的相关方法的内存地址已经获取到。这样做的好处就是提高效率,坏处可能有一点点,会提升性能的消耗。

具体路由和逻辑代码

在这里假设来一个 GET 请求,urls 和 views里面的代码如下:

# urls.py

url(r'^book/(?P<id>\d+)/', views.Book.as_view()),
# views.py
class Book(APIView): def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) def get(self, request, id): response = {'status': 100, 'msg': None} book = models.Book.objects.filter(pk=id).first()
book_ser = BookSerib(book, many=False)
print('book_ser.data', book_ser.data)
response['books'] = book_ser.data
response['msg'] = '获取图书成功'
print('response', response)
return Response(response)

urls 里面就是一个典型的 CBV 的路由配置,在 views 中一个是路由分发方法,一个是获取单本图书信息(通过 id)。

as_view 具体执行流程

在项目启动时,相应的函数内存地址已经获取到,那么具体是怎么获取到的呢?

在上面的代码中可以看到 Book类是继承自APIView类的,所以在路由配置里面执行的as_view方法如果Book类没有重写,那么执行的就是按照mro列表顺序查找到的第一个方法,在这里执行的是APIView类中的as_view方法。

查看该源码如下:

APIView类的父类是View类,查看该类的as_view方法,源码如下:

具体as_view就是将view函数的内存地址返回,以便请求来时直接调用。

initkwargs这个参数应该是由 django 内部传的一些参数,如下所示:

请求到来时

因为经过 django 先执行了as_view返回view的内存地址,所以会直接执行view函数,如下:

在这里该 self 由于是 继承自APIView类的Book类的对象,所以dispatch方法首先去自身找,之后去父类找,在APIView类中找到dispatch方法,源码如下:

initialize_request方法:

源码如下:

在实例化Request对象时,authenticators参数需要在认证时使用,所以先把这个参数的值找出来。步骤如下:

  • 调用 self.get_authenticators

  • 找到 self.authentication_classes

  • 找到 api_settings,才能找到DEFAULT_AUTHENTICATION_CLASSES

  • DEFAULT和IMPORT_STRINGS参数
  1. DEFAULT参数

  1. IMPORT_STRINGS参数

  • 实例化 APISettings 对象

  • 通过__getattr__方法获取值

  • 执行perform_import方法

  • 执行import_from_string

  • 执行import_module

  • 执行_bootstrap._gcd_import

  • 执行_sanity_check

  • _sanity_check返回,执行_find_and_load方法

  • 所以通过__getattr__的到的是一个列表,里面是两个类,分别是[rest_framework_authentication_SessionAuthentication, rest_framework_authentication_BasicAuthentication]

到这里,initialize_request方法执行结束,得到一个经过 Request 类实例化的 request 对象,该对象里面含有原生 request 对象,可以通过request._request取到。

initial 方法:

源码如下:

这里传入的request参数是经过Request封装后的参数

  • 执行get_format_suffix

执行完这个方法,self_format_kwarg = None

  • 执行perform_content_negotiation

  1. 执行self.get_renders

  1. 执行self.get_content_negotiator

  1. 执行 conneg.select_renderer方法

未完待续…...

Django-restframework 之认证源码分析的更多相关文章

  1. Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程

    一.序列化类的增.删.改.查 用drf的序列化组件   -定义一个类继承class BookSerializer(serializers.Serializer):   -写字段,如果不指定source ...

  2. Django(64)频率认证源码分析与自定义频率认证

    前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...

  3. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

  4. django的RestFramework模块的源码分析

    一.APIView源码分析 查看源码的前提要知道,找函数方法必须先在自己的类中找,没有再往父类找,一层一层网上找,不能直接按ctrl点击 在我们自己定义的类中没有as_view方法的函数,所以肯定是继 ...

  5. Python学习---Django的request.post源码分析

    request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去

  6. Django 之 restframework 解析器源码分析

    解析器分类: 1. JSONPaser ----> 解析 JSON-serialized data (解析JSON序列化的数据) 2.FormParser ---->解析form 表单中 ...

  7. Django rest framework 版本控制(源码分析)

    基于上述分析 #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) #2.1处理版本信息 #versi ...

  8. laravel5.5用户认证源码分析

    目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...

  9. drf认证源码分析

    补充: 一.django中间件之路由斜杠的自动添加源码 其实我们每次在写路由的时候,如果在路由层给他设置的是加/,但实际上我们在浏览器中输入的时候并没有加/发现也能调用,前面说了是浏览器内部走了重定向 ...

随机推荐

  1. java I/O (一)

    java 的I/O类基本上可以分为6大类:二进制的输入,二进制的输出,文本的输入,文本的输出,FILTER类和其他对文件操作的工具类. Java的I/O类主要在java.io的包里,其中两个主要的流为 ...

  2. 正则表达式re模块小结

    re模块的常用方法 1.compile(pattern[,flags]) 创建模式对象,一般配合其他方法使用.例如: import re #导入re模块 text = 'All that doth f ...

  3. unity3d从入门到精通要掌握什么内容

    Unity3d就业方向广.游戏行业占据了65%的比例,也有虚拟现实,增强现实等方向,就业前景火爆.可以从事的岗位:游戏开发工程师.移动应用开发工程师.游戏场景设计师.游戏特效设计师.VR开发工程师.A ...

  4. 关于Java的散列桶, 以及附上一个案例-重写map集合

    为速度而散列: SlowMap.java说明了创建一个新的Map并不困难.但正如它的名称SlowMap所示,它不会很快,如果有更好的选择就应该放弃它.它的问题在于对键的查询,键没有按照任何特定的顺序保 ...

  5. PAT1107:Sum of Number Segments

    1104. Sum of Number Segments (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Pen ...

  6. 如何使用RedisTemplate访问Redis数据结构

    RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...

  7. SQL关于IN和EXISTS的用法和区别的比较

    1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b.....).2.exist会针对子查询的表使用索引. not exist会对主子查询都 ...

  8. 二十四、Hadoop学记笔记————Spark的架构

    master为主节点 一个集群中可能运行多个application,因此也可能会有多个driver DAG Scheduler就是讲RDD Graph拆分成一个个stage 一个Task对应一个Spa ...

  9. JavaScript-点击任意点显示隐藏

    //开/关 var only = document.getElementById('only'); var centerBox = document.getElementById('centerBox ...

  10. 在单用户模式下修改CentOS的root密码

    我们在使用CentOS的过程中可能会发生忘记root用户密码的情况,本文就从应用的角度简单介绍一下如何在单用户模式下修改root用户的密码. 开启CentOS,进入系统启动菜单 将光标停留在系统开机时 ...