码迷,mamicode.com
首页 > 其他好文 > 详细

Django之请求生命周期及FBV/CBV模式

时间:2018-12-29 01:11:46      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:def   menu   ebe   http   ges   pattern   res   包括   ffffff   

一.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实现。
三.欢迎关注笔者公众号
技术分享图片

Django之请求生命周期及FBV/CBV模式

标签:def   menu   ebe   http   ges   pattern   res   包括   ffffff   

原文地址:http://blog.51cto.com/10836356/2336680

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!