- 输入网址url 。
- 先进行缓存解析,当用户浏览器中有此网站的缓存时,就绪准备使用
- DNS解析:域名解析,将你输入的网址解析为ip地址。
- 建立tcp连接,因为tcp是面向连接的,所以要经历三次握手。
- 发送Http请求,包括url,request_method等。
- 服务器处理请求,包括调用静态文件,访问数据库等。然后将结果通过服务器返回给客户端
- 客户端响应返回结果,即使是错误信息。
详细点的:
- DNS解析,把网址转化为IP地址。
- 建立TCP连接,所以要经历三次握手
第一次握手,客户端发送同步信号SYN=1,并发送初始序列号seq=x,服务器端收到来自客户端的同步序列号,确认建立连接。
第二次握手,服务端发送同步信号SYN=1, 确认信号ACK=1,初始序列seq=y,确认信息ack=x+1。
第三次握手,客户端收到服务器的信息,发送确认信号ACK,序列号seq=x+1,确认信息ack=y+1,建立TCP连接。
- 发送Http请求,包括url,request,method等信息。
发送请求后,web server会获取这个请求,然后通过请求转发给web application,web application接收请求,加载中间件,调用get_response()方法,这个方法就是找到对应的视图,执行视图中的方法,与此同时,调用回调方法,将响应头返回给web server,然后视图执行完将处理结果返回给web server。
在执行视图时,如果时FBV,则直接执行,如果是CBV,在进行路由匹配的时候会执行CBV的as_view()方法,这实现了一个闭包,即as_view()方法了内部的一个函数,view()函数,在view函数中返回的时dispatch方法,dispatch方法通过对象关系映射的方式,根据你请求的方法执行不同的函数。
这里还要说明的一点是,上面的视图是继承的View,若使用rest-framework,继承了APIView
这个类在as_view处就重写了,View的请求之前,会执行csrf_token验证,而APIView中,as_vew()方法返回的内部函数iew,用装饰器csrf_exempt装饰,免除了验证
,也会执行到dispatch方法,这个dispatch方法:
1.
封装了request,封装后的request中有原来的request,解析器对象,和认证类对象等。
2.
将CBV进行initial操作,获取到了版本,认证,权限,节流等信息,也就是关于rest-framework组件的操作。
3.
对象关系映射,执行对应的方法。
- 服务器接受处理请求,将结果返回给客户端
- 客户端将结果渲染,显示页面。
网友评论