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多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  2. HTML标签fieldset

    一个不常用的HTML标签fieldset,不过我觉得比较有意思,其语法如下: <fieldset> <legend>fieldset名称</legend> < ...

  3. 连接Access数据遇到的问题总览!

    由于要访问一个厂商的access数据,所以要写一个对于access的demo,相对于mysql.sqlserver来说,连接access花费了不少精力,现在将遇到的问题分享出来,以后大家遇到类似问题时 ...

  4. 【转】数据库事务ACID以及事务隔离

      本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指 ...

  5. PAT1121:Damn Single

    1121. Damn Single (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue "Dam ...

  6. 【转】maven跳过单元测试-maven.test.skip和skipTests的区别

    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...

  7. BootStrap 专题

    验证码的输入框和验证码图片在一行,用bootstrap原生的怎么写呢? 看了教程,没有完全一样的可以让右侧的按钮“输入验证码”固定大小.左侧的输入框动态大小吗?   <div class=&qu ...

  8. datetime日期和时间

    datetime是Python处理日期和时间的标准库. from datetime import datetime # 获取当前时间 now = datetime.now() print(now) # ...

  9. underscore源码阅读

    1:函数式编程初探 2:if(obj.length === +obj.length)的判断 3:JS对象属性用中括号表示的优点在于可以用变量表示属性 4:callee,caller---JS高级程序设 ...

  10. TCP的延迟ACK机制

    TCP的延迟ACK机制 TCP的延迟ACK机制一说到TCP,人们就喜欢开始扯三步握手之类的,那只是其中的一个环节而已.实际上每一个数据包的正确发送都是一个类似握手的过程,可以简单的把它视为两步握手.一 ...