Django中请求的生命周期

Django中请求的生命周期

1、概述

首先我们知道HTTP请求及服务端响应中传输的都是字符串,

Django的请求生命周期指的是当用户在浏览器输入url到用户看到网页的这个时间段内,Django后台所发生的事情

1、当用户在浏览器输入url的时候,浏览器会发送请求头和请求体给服务端,请求头和请求体会包含浏览器的动作(action),通常为get或post,包含在url中。以get方式请求数据时,请求头里有信息,请求体里没有数据,以post请求数据时,请求头和请求体里都有数据.  

2、url讲过Django的wsgi和中间件后,到达路由映射表,一条一条匹配,当匹配成功的时候就会执行对应的视图函数,不会再往下匹配了。

3、视图函数根据请求查询对应的数据返回给Django后,Django将数据做成字符串返回给客户端

4、客户端浏览器接收到返回的数据,经过渲染后返回给用户

客户端通过get请求像服务端发送nid=user请求,服务端可以通过request.GET.get('nid')的方式获得nid的数据,而当客户端通过post的方法请求时则服务端通过request.POST.get来获取数据。

需要注意的是,requset.POST是吧请求的数据转换成一个字典,请求体中的数据默认是以字符串形式存在的


2、FBV模式和CBV模式

一个url对应一个视图函数,这种模式称为FBV模式(Function Base Views)

另外一种模式称为CBV模式(Class base views),即一个url对应一个类

例如:使用CBV模式来请求网页

urlpatterns=[
    url(r'^fbv/',views.fbv),
    url(r'^cbv/',views.CBV.as_view()),
]

视图函数配置

from django.views import View

class CBV(View):
    def get(self,request):
        return render(request, "cbv.html")

    def post(self,request):
        return HttpResponse("cbv.get")

使用fbv的模式,在url匹配成功之后,会直接执行对应的视图函数.

而如果使用cbv模式,在url匹配成功之后,会找到视图函数中对应的类,然后这个类回到请求头中找到对应的Request Method.如果是客户端以post的方式提交请求,就执行类中的post方法;如果是客户端以get的方式提交请求,就执行类中的get方法,然后查找用户发过来的url,在类中执行对应的方法查询数据。

2.1 FBV方式的请求过程

用户发送url请求,Django会一次遍历路由映射表中的记录,一旦匹配就执行对应的视图函数

2.2CBV方式的请求过程

用户发给服务端的请求包含url和请求方法method,都是字符串类型,

服务端通过路由映射表匹配成功后会自动去找dispatch方法,通过dispatch反射的方式找到类中对应的方法并执行,

执行完毕之后,会把客户端想要的数据返回给dispatch,由其返回给客户端


3、Django请求生命周期之响应内容

http提交数据的方式有"post","get","put","patch","delete","head","options","trace".

HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

提交数据的时候,服务端依据method的不同会触发不同的视图函数.

对于from表单来说,提交数据只有get和post两种方法

posted @ 2019-04-24 00:15  Dandelion-L  阅读(297)  评论(0)    收藏  举报