Django restframework 源码分析之认证详解
作者:Eurekaa 发布时间:2021-08-15 12:03:40
前言
最近学习了 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参数
DEFAULT参数
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
执行self.get_renders
执行self.get_content_negotiator
执行 conneg.select_renderer方法
来源:http://www.cnblogs.com/zuanzuan/p/10412165.html


猜你喜欢
- 目录一、== 是比较两个对象的内容是否相等二、is 比较的是两个实例对象是不是完全相同三、使用is注意python对于小整数使用对象池存储问
- 引言本篇文章记录仿写一个el-collapse组件细节,从而有助于大家更好理解饿了么ui对应组件具体工作细节。本文是elementui源码学
- arcgis使用Python脚本进行批量截图介绍最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图
- python 消除序列的重复值,并保持原来顺序1、如果仅仅消除重复元素,可以简单的构造一个集合$ pythonPython 3.5.2 (d
- CSS的出现使网页制作者在对网页元素的控制方便许多,当然,有利必有弊,CSS只能对颜色、大小、距离等静
- 最近帮人做了个贪吃蛇的游戏(交作业用),很简单,界面如下:开始界面:游戏中界面:是不是很简单、朴素。(欢迎大家访问GitHub)游戏是基于P
- 1. 开始Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍
- 前言本文介绍CentOS7使用yum安装golang一、go语言介绍Go语言 是Google公司 在2007开发一种静态强类型、编译型语言,
- 1. 介绍BoltBoltDB是纯Go语言实现的持久化解决方案,保存数据至内存映射文件。称之为持久化解决方案不是数据库,因为数据库这个词有很
- pip是一个很好用的第三方库安装方式,但是默认的源没法连接,就算有时候可以成功率也很低,所以换成国内镜像源比较方便。将pip源更换到国内镜像
- 效果如图 一、获取天气def getWeather1(city): try:
- 如下所示:# -*- coding:utf-8 -*-class Solution: # matrix类型为二维列表,需要返回列
- “12-Factor” 是构建SaaS服务的一种方 * ,这套理论适用于任意语言和后端服务(数据库、消
- 如果您正尝试去处理元类,或者正受困于 Twisted 中的异步编程,或者正在研究由于使用了多分派而使您精疲力尽的面向对象编程,那么您完全错了
- 一、mysqldump 简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要
- 我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用WebSocket技术提供实时通信能力。本文介绍如何使用Golang实现实时
- SCN(System Change Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、R
- 登陆万事开头难,做什么事都要有个起点,后面才能更好的进行下去,因此我选择的起点就是最为直观的登陆页面 /login/index.vue/sr
- 调用opencv库,将yuv图像转为jpg图像。代码如下:# define _CRT_SECURE_NO_WARNINGS#include
- 通常,当一个页面有太多信息要显示,而一页塞又不下所有信。为了请求速度、美观以及其他的各种理由,分页就会被我们请过来。让我们的用户可以选择是否