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 View
def 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 View
class 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实现。
三.欢迎关注笔者公众号
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享文章:Django之请求生命周期及FBV/CBV模式-创新互联
分享链接:http://scyanting.com/article/deegdc.html