Django的请求生命周期
请求生命周期
请求生命周期是指当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情。
1.客户端发送Http请求
2 .服务器接收,根据请求头中的url在路由关系进行匹配
3.匹配成功后,执行指定的views函数
URL---〉函数 ==〉FBV URL---〉类 ==〉CBV
4.业务处理(根据个人需求自定)
操作数据库:
原生SQL(pymysql) Django ORM
操作模板
响应
5.渲染页面返回给客户端
1.客户端发送Http请求
在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中。
这种访问为get请求,请求只有请求头,没有请求体。
客户端发送Http请求后,Django会解析请求,进行路由分发。
使用get请求
使用get方式请求服务器的时候,所有数据包含在url中。
例如:http://127.0.0.1/index/?user=user1?password=123456
服务端接收数据:
request.GET.get("user")
request.GET.get("password")
使用post请求
使用post方式请求服务器的时候,所有数据都在请求体中。
服务端接收数据:
request.POST.get("user") request.POST.get(password"")
2 .服务器接收,根据请求头中的url在路由关系进行匹配
注意:上下匹配,一旦匹配,就不会继续匹配。
所以为了避免匹配到上面的url,而没有匹配到下面的url,会在后面加上。
3.匹配成功后,执行指定的views函数
一个url对应一个视图函数,这个模式叫做FBV(Function Base Views) 一个url对应一个类,这个模式叫做CBV(Class Base views)
总结:一种函数式的,一种面向对象。
CBV
路由信息:
1 from django.contrib import admin 2 from django.urls import path 3 from blog import views 4 urlpatterns = [ 5 path('admin/', admin.site.urls), 6 path('fbv/',views.FBV), 7 path('cbv/',views.CBV.as_view()), 8 ]
视图函数配置:
1 from django.shortcuts import render,HttpResponse 2 from django.views import View 3 4 5 6 class CBV(View): 7 def get(self,request): 8 return render(request, "cbv.html") 9 10 def post(self,request): 11 return HttpResponse("cbv.post")
cbv.html:
1 <body> 2 <form method="post" action="/cbv/"> 3 {% csrf_token %} 4 <input type="text"> 5 <input type="submit"> 6 </form> 7 </body>
第一次访问是通过get的方式:返回cbv.html
第二次访问时通过表单的方式:返回cbv.post
启动django,访问:http://127.0.0.1:8080/cbv/
输入name,提交数据
CBV请求过程:
服务端通过路由映射表匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行
类中的方法执行完毕之后,会把客户端想要的数据返回给dispatch方法,由dispatch方法把数据返回经客户端
例子,把上面的例子中的视图函数修改成如下:
from django.views import View class CBV(View): def dispatch(self, request, *args, **kwargs): print("dispatch......") res=super(CBV,self).dispatch(request,*args,**kwargs) return res def get(self,request): return render(request, "cbv.html") def post(self,request): return HttpResponse("cbv.get")
FBV
FBV请求过程:
用户发送url请求,Django会依次遍历路由映射表中的所有记录,一旦路由映射表其中的一条匹配成功了, 就执行视图函数中对应的函数名,这是fbv的执行流程。
视图函数配置:
1 def FBV(request): 2 if request.method == "GET": 3 return HttpResponse("fbv.html") 4 if request.method == "POST": 5 return HttpResponse("FBV.post")
fbv.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <body> 9 <form method="post" action="/fbv/"> 10 {% csrf_token %} 11 <input type="text"> 12 <input type="submit"> 13 </form> 14 </body> 15 </body> 16 </html>
Django请求生命周期之响应内容
http提交数据的方式有"post","get","put","patch","delete","head","options","trace".
from表单支持get与post请求。
ajax支持全部请求。
在响应内容中设置请求头与实体
1 2 class CBV(View): 3 def dispatch(self, request, *args, **kwargs): 4 print("dispatch......") 5 res=super(CBV,self).dispatch(request,*args,**kwargs) 6 print(res) 7 return res 8 9 def get(self,request): 10 return render(request, "cbv.html") 11 12 def post(self,request): 13 14 res=HttpResponse("cbv.post")#请求实体 15 res['head']="head" #设置请求头 16 res.set_cookie("k2","v2") #设置cookies 17 res.set_cookie("k4","v4") 18 print("res:",res) 19 print("request.cookie:",request.COOKIES) 20 return res