Django自学笔记之中间件

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z564359805/article/details/90070543
  • 是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出
  • 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中
  • 每个中间件组件是一个独立的Python类,可以定义下面方法中的一个或多个
    • _init _:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
    • process_request(request):执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    • process_view(request, view_func, view_args, view_kwargs):调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    • process_template_response(request, response):在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
    • process_response(request, response):所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
    • process_exception(request,response,exception):当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
  • 使用中间件,可以干扰整个处理过程,每次请求中都会执行中间件的这个方法

在应用booktest中新增加一个文件myException.py:

#!/usr/bin/env python
# coding=utf-8
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

# 自定义中间件,要继承于MiddlewareMixin
class MyException(MiddlewareMixin):
    def process_exception(self,request,exception):
        print("MyException里面的 process_exception")
        return HttpResponse(exception)

class MD1(MiddlewareMixin):

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


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

settings.py中:

MIDDLEWARE = [
    'booktest.myException.MyException', # 新增
    'booktest.myException.MD2',# 新增,顺序会影响输出的结果
    'booktest.myException.MD1',# 新增,顺序会影响输出的结果
    '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',
]

views.py中:

from django.http import HttpResponse

# 中间件练习
def myEx(request):
    return HttpResponse(int('hello')) # 正常来说这里肯定报错

urls.py中:

from django.urls import path

urlpatterns = [
    path('myEx/',views.myEx),
]

启动服务输入:http://127.0.0.1:8000/myEx/

控制台输出(MD2和MD1输出的顺序和设置settings.py中的顺序一致):

猜你喜欢

转载自blog.csdn.net/z564359805/article/details/90070543