python---django请求-响应的生命周期(FBV和CBV含义)

Django请求的生命周期是指:当用户在访问该url路径是,在服务器Django后台都发生了什么。

客户端发送Http请求给服务端,Http请求是一堆字符串,其内容是:

访问:http://crm.oldboy.com:8080/login.html,客户端发送Http请求

1.路由映射,匹配路由(从上到下,匹配到就停止),对应相应views中的业务函数

url(r‘^login.html‘, views.login),

2.匹配成功后,执行views下的对应函数:(FBV)

def login(req):
    print(‘req.body‘,req.body)
    print("GET",req.GET)
    message=‘‘
    if req.method == "POST":
        print(req.body)
        print(req.POST)

        user = req.POST.get("username")
        pwd = req.POST.get("password")

        count = models.Administrator.objects.filter(username=user,password=pwd).count()
        if count:
            red = redirect("/index.html")
            timeout = datetime.datetime.now()+datetime.timedelta(seconds=3)
            red.set_cookie(‘username‘,user,expires=timeout)
            return red
        else:
            message = "用户名或密码错误"
    return render(req,"login.html",{‘msg‘:message})

URL -->  函数  ====>  FBV(Function-based views)    基于函数的视图
URL -->  类    ====> CBV (Class-based views)    基于类的视图

FBV:在Django中使用较多,在其他框架中多使用CBV,例如tornado,还有PHP的多种框架等

Django中CBV使用:

首先需要设置views中的类:

from django.views import View
class CBV(View):   #根据请求头中的request method进行自动执行get和post
    def get(self,request):
        return render(request,"cbv_login.html")

    def post(self,request):
        return HttpResponse("<h1>cbv_post</h1>")

然后修改urls文件路由:

urlpatterns = [
    url(r"cbv",views.CBV.as_view())
]

模板文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/cbv" method="post">
    {% csrf_token %}
    <div>
        <label for="user">用户名:</label>
        <input type="text" id="user" name="username"/>
    </div>
    <div>
        <label for="pwd">密码:</label>
        <input type="password" id="pwd" name="password"/>
    </div>
    <div>
        <label></label>
        <input type="submit" value="登录">
        <label>{{ msg }}</label>
    </div>
</form>
</body>
</html>

cbv_login.html

使用url访问默认是get方式,显示cbv_login.html页面,提交页面,进入post页面,显示cbv_post数据

get还是post,是由于请求头中的Request Method:获取,从而找到对应方法。使用反射查找,来执行对应方法。

1.由Request URL请求去获取路径,与urls进行匹配,找到对应的类
2.由请求体得到:Request Method:GET
3.获得类中方法
   方法名  =  getattr(对象,"GET")
   方法名()    #执行对应函数

源码查看:

@classonlymethod
    def as_view(cls, **initkwargs):
        """
        Main entry point for a request-response process.请求-响应的主入口点,在url解析时调用
        """
     for key in initkwargs:
     #cls.http_method_names:
     #[u‘get‘, u‘post‘, u‘put‘, u‘patch‘, u‘delete‘, u‘head‘, u‘options‘, u‘trace‘]
            if key in cls.http_method_names:
                raise TypeError("You tried to pass in the %s method name as a "
                                "keyword argument to %s(). Don‘t do that."
                                % (key, cls.__name__))
            if not hasattr(cls, key):
                raise TypeError("%s() received an invalid keyword %r. as_view "
                                "only accepts arguments that are already "
                                "attributes of the class." % (cls.__name__, key))
        #print(cls)  #<class ‘app1.views.CBV‘>
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)  #实例化CBV对象
            if hasattr(self, ‘get‘) and not hasattr(self, ‘head‘):
                self.head = self.get
            self.request = request
            #print(request)    <WSGIRequest: GET ‘/cbv‘>
            #print(request.method)  GET
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)#调用dispatch方法,将<WSGIRequest: GET ‘/cbv‘>传入
        view.view_class = cls
        view.view_initkwargs = initkwargs

        # take name and docstring from class
        update_wrapper(view, cls, updated=())

        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(view, cls.dispatch, assigned=())
        return view

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn‘t exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn‘t on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #去调用对应的函数
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

推荐:介绍——基于类的视图(class-based view)

3.业务处理

-----根据个人需求自定义

-----对于框架:基本操作是操作数据库

  ---pymysql   (原生)

  ---SQLAlchemy

  ---Django中orm

-----响应内容:返回给用户的结果:响应头和响应体

我们写的HTTPResponse是写在响应体中

响应头的定制:

    def post(self,request):
        ret =  HttpResponse("<h1>post</h1>")     #下面为设置请求头
        ret[‘h1‘] =‘v1‘
        ret.set_cookie(‘c1‘,‘v1‘)
        ret.set_cookie(‘c2‘,‘v2‘)
        ‘‘‘
        响应头:h1=v1
                cookies:c1=v1;c2=v2
        响应体:<h1>post</h1>
        请求头信息:
        Content-Length:13
        Content-Type:text/html; charset=utf-8
        Date:Wed, 28 Mar 2018 13:54:53 GMT
        h1:v1
        Server:WSGIServer/0.1 Python/2.7.10
        Set-Cookie:c2=v2; Path=/
        Set-Cookie:c1=v1; Path=/
        X-Frame-Options:SAMEORIGIN
        ‘‘‘
        return ret

原文地址:https://www.cnblogs.com/ssyfj/p/8666664.html

时间: 2024-12-30 12:10:06

python---django请求-响应的生命周期(FBV和CBV含义)的相关文章

ASP.NET MVC5请求管道和生命周期

请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler.所有的HTTP请求都会进入IHttpHandler,有IHttpHandler进行最终的处理,而IHttpModule通过订阅HttpApplication对象中的事件,可以在IHttpHandler对HTTP请求进行处理之前对请求进行预处理或IHttpHandler对HTTP请求处理之后进行再次处理. 在IIS7之前,如IIS6或IIS5,请

☆Django☆---表的设计 生命周期 分组 解析 路由层 视图层

图书管理系统的 表 设计 图书管理系统分别有三张表 作者表 书籍表 出版社表  他们 的对应关系为 如何在 Django中建立表与表之间的关系? 首先我们需要在 app文件里 的 models创建出 这三张表 然后做对应关系 复习Django的操作: 1.创建好app后需要 将app添加到INSTALLED_APP = [] 里面 2.在Django中添加mysql数据库 >>>点击 侧边栏中的 database  >>>然后左上角的加号 >>> 点击

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

Django请求生命周期: 1.发送http请求2.服务器接受,根据请求头中的url在路由关系表中进行匹配(从上到下)3.匹配成功后,执行指定的views函数 URL -> 函数 ==>FBV URL -> 类 ==>CBV4.业务处理 - 根据个人需求自定 - 操作数据库 - 原生SQL - Django ORM ==> 返回给用户的结果 <== - 响应内容 - 响应头 - 响应体 原文地址:https://www.cnblogs.com/ray-h/p/10241

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

Django中请求的生命周期 和 FBV模式和CBV模式

Django的生命周期就是你的 一个请求所发生的整个流程 Django的生命周期内到底发生了什么呢?? 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中. 2. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配, 一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了. 3. 视图函数根据客

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

一.Http请求的过程1.http的请求/响应模式,先是用户通过前端页面发送一个http请求,请求内容包括三部分:请求头/空行/请求体(get方法没有请求体)例如:抓包如下:2.服务端就收到http的请求内容的字符串后,进行解析出相应的请求头(method /url/cookie等信息 )和请求体内容,并将请求体的内容转换成对应的key-value格式.3.服务端再通过url去匹配对应的URL路由(匹配规则是从上向下进行正则匹配,若匹配成功则停止不再向下匹配),匹配成功后找到views中对应的函

Django请求生命周期和ORM

dajngo请求生命周期 django请求生命周期是:当用户在browser点击URL后,在django后台都发生了什么. 请求响应Http 1.发送Http请求 2.服务器接收,根据请求头中url在路由关系表中进行匹配(从上到下) 3.匹配成功后,执行指定的views函数 URL –>函数 --->FBV URL –>类     --->FBV 4.业务处理 根据个人需求自定 操作数据库 原生SQL Django ORM ---->返回给用户的结果<----- -响应

Django补充——中间件、请求的生命周期等

一:中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图. 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是: pro

源码剖析Django REST framework的请求生命周期

学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基于Django的API框架,REST framework采用的是CBV的请求模式. 所以在一个项目中,使用了REST framework的时候, 请求到达REST framework后,也先执行REST framework中的dispatch方法 先来看看dispatch方法的源码 def disp