django中间件 middleware

文章目录

  • 一、中间件 middleware
    • 1.Django框架中的中间件(概念)
    • 2.settings中配置中间件
    • 3.中间件在MVT中的作用机制图
    • 4.中间件的类和类中方法
      • ① Request预处理函数
      • ② View预处理函数
      • ③ 分界线------------views视图------------分界线
      • ④ Template模版渲染函数
      • ⑤ Exception后处理函数
      • ⑥ Response后处理函数
  • 二、中间件的配置
    • 1.在项目主目录中创建一个middlewaretest.py的文件
    • 2.在middlewaretest.py中重写中间件函数
    • 3.在settings.py中配置中间件
  • 三、中间件的使用
    • 1.process_request的使用
      • ① middlewaretest.py重写方法
      • ②将配置文件修改为所有人均可访问
      • ③命令行输入命令运行
      • ④ request可适用范围
    • 2.process_view的使用
    • 3.process_exception的使用
    • 4.process_response的使用
    • 5.process_template_response的使用

一、中间件 middleware


1.Django框架中的中间件(概念)


django的中间件是一个轻量级的插件系统,在django中的请求和响应中,可以利用中间件干预视图的请求和响应。


2.settings中配置中间件


django中间件 middleware_第1张图片


3.中间件在MVT中的作用机制图


django中间件 middleware_第2张图片


4.中间件的类和类中方法


中间件是一个面向对象的类,有五个方法

① Request预处理函数

process_request(self, request)
  • 运行时间:在请求后,在process_view 之前,在执行views之前

② View预处理函数

 process_view(self, request, callback, callback_args,callback_kwargs)
  • 运行时间:在process_request之后,在views之前

③ 分界线------------views视图------------分界线

④ Template模版渲染函数

process_template_response()
  • 运行时间:默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值(对象)中rende方法的结果)

⑤ Exception后处理函数

process_exception(self, request, exception)
  • 运行时间:这个方法只有在 request 处理过程中出了问题并且view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。
  • 参数这个函数的参数除了一贯的request对象之外,还包括view函数抛出的实际的异常对象exception
  • process_exception() 应当返回None或HttpResponse对象。如果返回None,Django将用框架内置的异常处理机制继续处理相应request。
  • 如果返回HttpResponse对象,Django将使用该response对象,而短路框架内置的异常处理机制。

⑥ Response后处理函数

process_response(self, request, response)
  • 运行时间:这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。该处理器能修改response 的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。
  • 参数:request是request对象,而response则是从view中返回的response对象。
    process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

二、中间件的配置


1.在项目主目录中创建一个middlewaretest.py的文件


django中间件 middleware_第3张图片


2.在middlewaretest.py中重写中间件函数


from django.utils.deprecation import MiddlewareMixin

class MiddleWareTest(MiddlewareMixin):
    def process_request(self, request):
        pass

3.在settings.py中配置中间件


django中间件 middleware_第4张图片


三、中间件的使用


1.process_request的使用


案例—封杀某个ip地址

① middlewaretest.py重写方法


from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse

class MiddleWareTest(MiddlewareMixin):
    def process_request(self, request):
        # 案例----封杀非法ip
        print(request.META['REMOTE_ADDR'])  # 获取访问的ip地址
        req_ip = request.META['REMOTE_ADDR']
        # 判断获取的ip
        if req_ip == '10.10.107.33':
            return HttpResponse('无法访问')
        else:
            print('正常访问')

②将配置文件修改为所有人均可访问


django中间件 middleware_第5张图片


③命令行输入命令运行


python manage.py runserver 0.0.0.0:8000

④ request可适用范围

        ## 对request携带的参数做预处理
        ## 例如参数中 是否含有敏感字等

2.process_view的使用


def process_view(self,request, callback, callback_args, callback_kwargs):
	# callback:对应的视图函数,访问的是哪个视图函数,callback就是那个函数
    # callback_args:元组类型,视图函数的参数
    # callback_kwargs:字典类型,视图函数的参数
    print('我是在process_request函数执行完后执行的函数process_view')

3.process_exception的使用


django中间件 middleware_第6张图片
案例-----此函数在出错后会执行,我们将报错信息写入日志

def process_exception(self, request, exception):
    import os
    from Qshop.settings import BASE_DIR
    print("我是 process_exception")
    print(exception)
    ## 将exception写入文件中 error.log, 打开文件
    file = os.path.join(BASE_DIR, 'error.log')
    with open(file, "a") as f:
        import time
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        content = "[%s]:%s\n" % (now, str(exception))
        f.write(content)
    return HttpResponse("代码报错了 
%s " % exception)

django中间件 middleware_第7张图片


4.process_response的使用


django中间件 middleware_第8张图片

 def process_response(self, request, response):
        print('我是响应对象')
        return response

5.process_template_response的使用


在这里插入图片描述
需要写视图和路由
在views中

#---------------------------------中间件模板测试
def myprocess_tem_rep(request):
    def test():
        return HttpResponse('my test')

    rep = HttpResponse('myprocee_tem_rep')
    rep.render = test
    return rep

路由:
在这里插入图片描述
middlewaretest.py

  def process_response(self, request, response):
        print('我是响应对象')
        return response

你可能感兴趣的:(#,python,web开发)