django请求生命周期

django请求生命周期

django请求生命周期_第1张图片

浏览器地址栏输入url地址到浏览器渲染页面的全过程

1,用户在浏览器(就是个socket套接字客户端)输入url地址,dns将域名解释为ip地址.
根据解析得到的服务端ip地址,浏览器和服务端三次握手建立tcp连接,
浏览器根据http协议封装数据,封装请求首行/请求头/请求体(get请求没有请求体,请求头和请求体之间必须要空行)
然后发送给服务端

2,服务端的wsgi(就是个socket套接字服务端)接收到请求,根据http协议对数据进行拆包,
然后交给中间件处理,由中间件决定是否接受浏览器请求.

3,中间件拦截到请求,依次按顺序经过所有中间件的process_request函数去处理请求,
process_request函数最后只会返回这2种结果(None或者response对象,django框架的中间件和scrapy爬虫框架的中间件都是一样的返回这两种结果).
如果返回None就会进入urls进行路由解析,如果中间件返回response对象,
就是拒绝浏览器的请求,就不会经过urls路由解析,而是直接交给中间件的process_response处理响应,会依次逆序经过所有中间件的process_response对象.
###中间件拓展知识:
常用的内置中间件有处理会话的session中间件,处理csrf_token的csrf中间件,处理登录校验的auth中间件,
自定义的中间件有处理跨域资源共享的cors中间件(这个需要自定义中间件且要继承MiddlewareMixin,
在中间件中定义process_request函数拦截所有请求,然后给请求对象添加Access-Control-Allow-Origin和Access-Control-Allow-Headers属性后再放行,
并把自定义中间件注册到配置文件的中间件列表里面才会生效).
**特别注意的特殊情况:浏览器请求的所有静态资源都不会经过中间件.例如请求获取图片就不会经过中间件拦截.网上说的在中间件里设置图片防盗都是无效的不要信**

4,路由接收到请求的url地址,开始在路由表中查找对应的视图,如果是带参数的路由(例如xxx/)还要看用户是否按要求传入了指定类型的参数,同时与url绑定的视图函数必须要有形参来接受路由中的参数.
###路由解析拓展知识:
视图分为视图函数和视图类.如果是视图函数,路由中的url地址只需和函数名绑定即可.
如果是视图类,需要调用视图类的as_view()函数才能和url绑定,视图类的as_view函数会返回内部函数view,view函数实例化视图类对象后再调用dispatch函数,
dispatch函数利用反射机制查找视图类中的视图函数,通过getattr(self,request.method.lower())查找实例对象中处理当前请求方式的视图函数,如果是get请求,就找到视图类中的get函数并调用

5,视图函数处理请求,需要对请求对象中的数据进行数据校验(反序列化)并操作数据库,通常是用Form对象(原生django框架生成form表单及表单校验的组件)或者Serializer对象(drf框架的序列化器)做数据校验,
数据校验成功后,才会利用orm去操作数据库增删改查,或者去templates文件夹中查找html模板

6.视图函数封装响应对象.视图函数序列化数据库中的数据或者渲染模板.用序列化器把数据库中的数据进行序列化(不能直接返回python自定义对象,要序列化成json字符串,否则浏览器不认识),或者去解析模板中的模板语法,
特别注意模板语法是django服务端自己解析的而不是浏览器解析的,浏览器根本不认识模板语法.模板中遇到{{ 变量语法 }}和{% 标签语法 %}就会去解析里面的内容,渲染完成后封装到响应对象中
###模板语法易错知识:
①调用变量中的函数一律不能加括号,变量语法中函数调用一律用"句点符",如{{ obj.func }}.而flask模板的函数调用要带括号{{ obj.func() }},容易搞混!
②django模板的路由反向解析要用标签语法{% url "app名:xxx路由" 路由中的无名参数使用位置参数传参 路由中的有名参数使用关键字参数传参 %},
而flask的jinja2模板的路由反向解析却要用变量语法{{ url_for("蓝图名.xxx路由",参数名=参数值,}) }},flask模板静态文件的引入也是用变量语法{{ url_for("static",filename="静态文件名",}) }}
③模板中的静态文件引用,如引入jquery,使用{% load static %},.
访问static文件夹中的静态文件,还需要事先在配置文件中设置静态文件的访问地址STATIC_URL = '/static/',和存储地址STATICFILES_DIRS = [os.path.join(BASE_DIR,"static"),]  
模板中引用静态文件最好用上述方法,否则会有大坑,如使用不带/的相对路径会找不到,
因为会直接在当前路由(假设是"域名:端口号/xxx/")的最后一个/拼接上相对路径变成"域名:端口号/xxx/static/jquery.js",而路由表中根本没有这个路由,
就算非要使用相对路径也要使用带/的相对路径,变成"域名:端口号/static/jquery.js"后就能找得到

7,视图函数返回封装好的响应对象给中间件

8.中间件拦截到视图函数返回的response对象,依次逆序经过所有中间件的process_response函数,
process_response函数即可以处理请求对象也可以处理响应对象,process_response函数最后必须返回response对象

9,响应的数据经过wsgi进行数据打包,根据http协议封装响应首行/响应头/响应体,之后返回响应给浏览器,浏览器根据http协议对收到的响应内容进行数据拆包解析,得到响应首行/响应头/响应体,然后渲染响应体中的内容


你可能感兴趣的:(django,django,python,后端)