Python笔记_54_Django组件_中间件_session源码解析

Django组件

中间件
中间件的概念

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。
  如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的Middleware:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定制中间件
中间件可以定义五个方法,分别是:
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
process_template_response(self,request,response)(了解)

自定制中间件使用步骤:

  1. 在APP下面新建一个py文件(文件名称自定制) middlewares.py

    from django.utils.deprecation import MiddlewareMixin
    
    class MD1(MiddlewareMixin):
        def process_request(self, request):
            pass  # 默认没有返回值, 如果有返回值,会终止后面的中间件的执行,并且会直接返回当前类下的process_response方法.
       
    	def process_response(self, request, response):
            return response
    
  2. settings.py注册MIDDLEWARE

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
        'app01.middlewares.MD1',   # 自定义中间件MD1
        'app01.middlewares.MD2',	# 自定义中间件MD2
    ]
    

执行顺序:
在这里插入图片描述
中间件可以定义的方法:

process_request方法

process_request(self, request)

在视图之前执行
按照settings的注册顺序执行
默认没有返回值.
有返回值时,直接执行该类下的process_response方法返回.后面还有中间件,就不会执行.

from django.utils.deprecation import MiddlewareMixin


class MD1(MiddlewareMixin):

    def process_request(self, request):
        print("MD1里面的 process_request")


class MD2(MiddlewareMixin):
    def process_request(self, request):
        print("MD2里面的 process_request")

我们访问一个视图,会发现终端中打印如下内容:

 MD1里面的 process_request
 MD2里面的 process_request
 app01 中的 index视图
process_response方法

process_response(self, request, response)
在视图之后执行
按照settings的注册倒序执行
必须要有返回值,没有会报错(http基于请求响应模式)

from django.utils.deprecation import MiddlewareMixin


class MD1(MiddlewareMixin):

    def process_request(self, request):
        print("MD1里面的 process_request")

    def process_response(self, request, response):
        print("MD1里面的 process_response")
        return response


class MD2(MiddlewareMixin):
    def process_request(self, request):
        print("MD2里面的 process_request")

    def process_response(self, request, response):
        print("MD2里面的 process_response")
        return response

访问一个视图,看一下终端的输出:

MD1里面的 process_request
MD2里面的 process_request
app01 中的 index视图
MD2里面的 process_response
MD1里面的 process_response

在这里插入图片描述

process_view方法

process_view(self, request, view_func, view_args, view_kwargs)

在视图之前执行
按照settings的注册顺序执行
默认没有返回值.
有返回值时,直接执行该类下的process_response方法返回.后面还有中间件,就不会执行.

from django.utils.deprecation import MiddlewareMixin


class MD1(MiddlewareMixin):

    def process_request(self, request):
        print("MD1里面的 process_request")

    def process_response(self, request, response):
        print("MD1里面的 process_response")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("-" * 80)
        print("MD1 中的process_view")
        print(view_func, view_func.__name__)


class MD2(MiddlewareMixin):
    def process_request(self, request):
        print("MD2里面的 process_request")

    def process_response(self, request, response):
        print("MD2里面的 process_response")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("-" * 80)
        print("MD2 中的process_view")
        print(view_func, view_func.__name__)

访问index视图函数,看一下输出结果:

MD1里面的 process_request
MD2里面的 process_request
--------------------------------------------------------------------------------
MD1 中的process_view
<function index at 0x000001DE68317488> index
--------------------------------------------------------------------------------
MD2 中的process_view
<function index at 0x000001DE68317488> index
app01 中的 index视图
MD2里面的 process_response
MD1里面的 process_response

在这里插入图片描述

process_exception方法

process_exception(self, request, exception)

在视图之后执行,触发条件为:视图内部触发异常,才能执行.
按照settings的注册倒序执行
当有返回值时,如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,,页面不会报错(返回状态码为200, 反之 500)

from django.utils.deprecation import MiddlewareMixin


class MD1(MiddlewareMixin):

    def process_request(self, request):
        print("MD1里面的 process_request")

    def process_response(self, request, response):
        print("MD1里面的 process_response")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("-" * 80)
        print("MD1 中的process_view")
        print(view_func, view_func.__name__)

    def process_exception(self, request, exception):
        print(exception)
        print("MD1 中的process_exception")


class MD2(MiddlewareMixin):
    def process_request(self, request):
        print("MD2里面的 process_request")

    def process_response(self, request, response):
        print("MD2里面的 process_response")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("-" * 80)
        print("MD2 中的process_view")
        print(view_func, view_func.__name__)

    def process_exception(self, request, exception):
        print(exception)
        print("MD2 中的process_exception")
  • 如果视图函数中无异常,process_exception方法不执行。
    想办法,在视图函数中抛出一个异常:
def index(request):
    print("app01 中的 index视图")
    raise ValueError("呵呵")
    return HttpResponse("O98K")
  • 在MD2的process_exception中返回一个响应对象
def process_exception(self, request, exception):
        print(exception)
        print("MD2 中的process_exception")
        return HttpResponse(str(exception))  # 返回一个响应对象
  • 看输出结果:
MD1里面的 process_request
MD2里面的 process_request
--------------------------------------------------------------------------------
MD1 中的process_view
<function index at 0x0000022C09727488> index
--------------------------------------------------------------------------------
MD2 中的process_view
<function index at 0x0000022C09727488> index
app01 中的 index视图
呵呵
MD2 中的process_exception
MD2里面的 process_response
MD1里面的 process_response

在这里插入图片描述

session源码解析

  1. 第一步在process_reqeust方法
  2. 第二步在视图层
  3. 第三步在process_response方法

详细步骤:
1.在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
4.
在这里插入图片描述
5.
在这里插入图片描述
6.
在这里插入图片描述7.
在这里插入图片描述8.process_reqeust方法
在这里插入图片描述9.
在这里插入图片描述10.视图设置session

   request.session['is_login'] = True

11.process_response 方法
在这里插入图片描述
12.
在这里插入图片描述13.
在这里插入图片描述14.
在这里插入图片描述15.
在这里插入图片描述16.
在这里插入图片描述17.
在这里插入图片描述18.
在这里插入图片描述19.
在这里插入图片描述

request.session.flush()的流程

截图:
1.

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值