Django 的View 是如何处理请求的
目录
一:预备知识
知道function view 和class -based view :了解如何定义URL,把请求转发到对应的View 上,也知道了如何在View 中获取请求数据,然后操作Model 层拿到数据,最后渲染模板并返回。
当Django 接受一个请求之后(严格来说是HTTP 请求,只不过HTTP 请求会被Django 转化为request 对象),请求会先经过所有middleware 的process request 方法,然后解析URL,接着根据配置的URL 和飞fiew 的映射,把request 对象传递到View 中。关于middleware 的流程,
这里的View 有两类,就是我们前面讲到的“nction view 和class-based view 。function view 的处理逻辑比较好理解,就是简单的函数,流程就是函数的执行流程,只是第一个参数是request 对象。class-based view 的流程需要说明一下。
二:class-based view 的处理流程
class-based view 对外暴露的接口其实是as_view 。
(一):as_view 的逻辑
as_view 其实只做了一件事,那就是返回一个闭包。这个闭包会在同ango 解析完请求之后调用,而闭包中的逻辑是这样的。
---------给class (也就是我们定义的View 类)赋值一一-request 、args 和kwargs 。
---------根据HTTP 方法分发请求。比如HTTP GET 请求会i周用class.get 方法, POST 请求会调用class.post 方法。
(二):请求到达之后的完整逻辑
我们知道as_view 做了什么事,也知道了as _view 返回的闭包是如何处理后续请求的。假设现在有一个GET 请求,我们来具体看一下ListView 的流程,其他的View 大同小异。
(1)请求到达之后,首先会调用dispatch 进行分发。
(2)接着会调用get 方法。
①在GET 请求中,首先会调用get _queryset 方法,拿到数据源。
②接着调用get_context _data 方法, 拿到需要渲染到模板中的数据。
I)在get _context_data 中,首先会调用get_paginate_by 拿到每页数据。
2)接着调用get_context_object_name 拿到要渲染到模板中的这个queryset名称
3)然后调用paginate_queryset 进行分页处理。
4)最后拿到的数据转为 dict 井返回。
③调用render to_respo口se 谊染数据到页面中。
l)在render_to_re sponse 中调用get _ tempalte_names 拿到模板名。
2)然后把request 、context 、template_name 等传递到模板中。
Django的FBV与CBV的比较杂谈