Django生命周期与中间件

Django中间件处理过程

首先客户端发起请求,会将请求交给settings.py中排在最前面的中间件

  • 前面中间件收到请求会调用类中的process_request方法处理,然后交给下一个中间件的process_request函数
  • 到达最后一个中间件的process_request函数处理后会到达url路由系统
  • 然后从路由系统直接跳转到第一个中间件的process_view函数,依次向后面中间的process_view传递,最后 到达views.py处理函数,获取网页中的数据
  • 获取的数据会交给最后一个中间件的process_response方法处理,然后依次向前面的中间件process_response方法提交请求的内容,最后由最前面的中间件将请求数据返回到客户端
  • 在任一中间件的process_request和process_view方法中有返回值就会直接返回给process_response

生命周期图解

在这里插入图片描述

Django生命周期请求过程

  • 客户端访问

客户端在浏览器中输入url路径访问指定网页

  • 请求发送给Django程序

首先会交给中间件,中间件处理后交给路由系统
Django程序会到urls.py文件中找到对应请求的处理函数(视图函数)

  • 视图函数

视图函数会找到对应的html模板文件
然后到数据库中取得数据替换html模板中的内容
使用static中的js和css文件结合对html渲染
最后Django将最终渲染后的html文件返回给中间件
中间件再调用process_response方法处理,最后交给用户

中间件使用举例

创建存放中间件的文件夹

  • 在工程目录下创建任意目录,这里创建路径为: /project/middle/m1.py

  • 在project/settings.py文件中注册我们自己的中间件

MIDDLEWARE = [
    'middle.m1.Row1',
    'middle.m1.Row2',
    'middle.m1.Row3',
]
  • 在views.py文件中写处理函数test

views.py处理函数

def test(request):
    # int('fds')    #当views函数出现异常,中间件中的process_exception执行
    print('异常')
    return HttpResponse('ok')
  • 在/project/middle/m1.py文件中定义中间件
from django.utils.deprecation import MiddlewareMixin
class Row1(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_1')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        #view_func_args:   url中传递的非字典的值会用这个变量接收
        #view_func_kwargs: url中传递的字典会传递到这个变量接收(如:nid=1)
        print('process_view_1')

    def process_response(self,request, response):    #response就是拿到的返回信息
        print('response_1')
        return response

    def process_exception(self, request, exception):
        '''只有当views函数中异常这个函数才会执行'''
        if isinstance(exception, ValueError):
            return HttpResponse('>>出现异常了')

class Row2(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_2')
        #1 如果在Row2中的process_request中有返回值,那么就不会到达Row3
        #2 Row2直接将返回值交给自己的process_response再交给Row1的process_response
        #3 最后客户端页面显示的就是‘走’请求没机会到达views函数,不会打印‘没带钱’
        # return HttpResponse('走')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        print('process_view_2')

    def process_response(self,request, response):
        print('response_2')
        return response

class Row3(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_3')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        print('process_view_3')

    def process_response(self,request, response):
        print('response_3')
        return response
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值