djangorestfulframework教程(Django restframework 源码分析之认证详解)
djangorestfulframework教程
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参数
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
- nginx django部署(uwsgi+nginx代理Django无法访问静态资源的解决)
- django常用模块(django celery redis使用具体实践)
- django框架教程学习(使用Django简单编写一个XSS平台的方法步骤)
- django框架教程第100讲(详解Django+Vue+Docker搭建接口测试平台实战)
- django整合前端流程日志权限(使用Django开发简单接口实现文章增删改查)
- django参数判断(Django保护敏感信息的方法示例)
- django 如何实现高并发(Django如何防止定时任务并发浅析)
- djangoapi接口开发(Django使用AJAX调用自己写的API接口的方法)
- pythondjango搭建web(PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上)
- pythondjango工作机制(Python后台开发Django会话控制的实现)
- django查找路径(Django Sitemap 站点地图的实现方法)
- django后台运行命令(Django框架实现的普通登录案例使用POST方法)
- django怎么创建模板文件(django模板结构优化的方法)
- django条件序列化(Django之无名分组和有名分组的实现)
- django模板自定义(详解Django项目中模板标签及模板的继承与引用网站中快速布置广告)
- pycharm怎么创建django项目(Python、 Pycharm、Django安装详细教程图文)
- 蓝色代表什么(蓝色代表什么性格的人)
- 红色代表什么(红色代表什么情感和含义)
- 南宋志南和尚绝句 杨柳风似庙中来(南宋志南和尚绝句)
- 今天要穿什么颜色(今天要穿什么颜色的衣服最吉利)
- 一道高中题-求杯子的高度(一道高中题-求杯子的高度)
- 网坛停摆三巨头亏损惨重,费德勒跌幅88 纳达少赚2400万(网坛停摆三巨头亏损惨重)
热门推荐
- mysql将字符串转换成整数(MYSQL字符串强转的方法示例)
- 如何看idea连接mysql数据库(IDEA 链接Mysql数据库并执行查询操作的完整代码)
- mysql的null值跟空值(你知道mysql中空值和null值的区别吗)
- mysqldecimal类型数据转换(mysql decimal数据类型转换的实现)
- web服务器架设和管理(浅谈Web服务器的安装与配置)
- javascript编程中的promise(JavaScript如何利用Promise控制并发请求个数)
- vue插槽的分类(vue具名插槽的基本使用实例)
- 运维堡垒机怎么搭建(堡塔云控平台添加服务器受控端图文教程)
- 如何应对网站安全问题(网站安全有哪些防护措施?)
- css3动画效果图(CSS3 三维变形实现立体方块特效源码)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9