Django之请求生命周期及FBV/CBV模式
一.Http请求的过程
1.http的请求/响应模式,先是用户通过前端页面发送一个http请求,请求内容包括三部分:请求头/空行/请求体(get方法没有请求体)
例如:
抓包如下:
2.服务端就收到http的请求内容的字符串后,进行解析出相应的请求头(method /url/cookie等信息 )和请求体内容,并将请求体的内容转换成对应的key-value格式。
3.服务端再通过url去匹配对应的URL路由(匹配规则是从上向下进行正则匹配,若匹配成功则停止不再向下匹配),匹配成功后找到views中对应的函数或类,执行对应函数或类中的业务代码,处理成功后则进行响应的返回;
4.返回的形式有三种:render(request,’*.html’,locals())/HttpResponse(‘字符’)/redirect(‘/url/’)
注意:HttpResponse()是直接返回字符串给前端浏览器进行显示;render()分为三步:a.返回字符串;b.替换(渲染)变量;c.返回给浏览器;redirect()是先去匹配需要跳转的url,再去匹配跳转的url再去重复render()的过程;
5.前端收到响应,响应的字符串内容也是包含三部分:响应头/空行/响应体。之后浏览器再去渲染返回的响应体展示给用户看。
二.FBV及CBV模式
FBV:function-views模式,也是常用的url对应views.py中对应的函数;
CBV:class-views模式,是不常用的url对应views.py中对应的类的模式;
FBV模式:
urlpatterns = [ # path('admin/', admin.site.urls), # url(r'^login/',views.login,name = 'login'), url(r'^mainmenu/',views.mainmenu,name = 'mainmenu'),#FBV模式 url(r'^login/',views.CLOGIN.as_view(),name = 'mainmenu'),#CBV模式]
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
from django.shortcuts import render,redirect# Create your views here.from django.views import Viewdef login(request): if request.method == 'POST': if request.POST.get('username') == 'admin' and request.POST.get('pwd') == 'admin': #session的使用 request.session['username'] = request.POST.get('username') request.session['pwd'] = request.POST.get('pwd') return redirect('/mainmenu/') #cookie的单独使用 # ret = redirect('/mainmenu/') # ret.set_cookie('username',request.POST.get('username')) # return ret else: return render(request, 'login.html') else: return render(request, 'login.html')
CBV模式:
urlpatterns = [ # path('admin/', admin.site.urls), # url(r'^login/',views.login,name = 'login'), url(r'^mainmenu/',views.mainmenu,name = 'mainmenu'),#FBV模式 url(r'^login/',views.CLOGIN.as_view(),name = 'mainmenu'),#CBV模式]
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
from django.shortcuts import render,redirect# Create your views here.from django.views import Viewclass CLOGIN(View): # 这个函数(了解作用即可,可不写)作用类似于装饰器,参数*args, **kwargs代表可传进去多个参数 def dispatch(self, request, *args, **kwargs): # 重写dispatch方法,相当于执行get/post方法(关键看传来的是那种请求方式,如果是get请求方式,就执行get方法) result = super(CLOGIN,self).dispatch(request, *args, **kwargs) return result # 函数名只能是get,一旦有get请求发来,就执行此函数 def get(self,request): return render(request, 'login.html') # 函数名只能是post,一旦有post请求发来,就执行此函数 def post(self,request): if request.POST.get('username') == 'admin' and request.POST.get('pwd') == 'admin': # session的使用 request.session['username'] = request.POST.get('username') request.session['pwd'] = request.POST.get('pwd') return redirect('/mainmenu/') else: return render(request, 'login.html')
POST/GET请求方式不同:
浏览器默认的方式是get形式,也是说只要不规定post请求,浏览器都是以get方式请求。post请求只有通过form表单和ajax实现。
三.欢迎关注笔者公众号
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。