searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Django的中间件

2023-05-16 07:29:37
14
0

一、中间件基本介绍

       中间件是位于平台(硬件和操作系统)和应用之间的通用服务,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现(这是宏观的定义)。

      Django里的中间件指的是用来处理请求和响应的钩子,可以在请求进入正式处理流程之前进行一些基本的检查和预处理,也可以在响应返回的时候对数据进行后处理。总之是一种全局性的控制输入和输出的插件。

 

二、Django中如何使用中间件

  1. Django中的默认中间件配置在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',
    ]​
  2. 中间件的处理顺序
  3. 上图中的处理流程中,共有5个箭头,每个箭头都是提供给用户自定义的函数。
    process_request(self,request)  # 作用:执行主路由之前被掉用,在每个请求上调用,返回None(请求通过)或者HttpResponse对象(请求不通过)
    
    process_view(self, request, view_func, view_args, view_kwargs) # view_func为视图函数,view_args是位置参数,view_kwargs是关键字参数,调用视图之前被调用,在每个请求上调用,返回None(请求通过)或者HttpResponse对象(请求不通过)
    
    process_exception(self, request, exception)  # 处理过程中抛出异常时被调用,返回一个HttpResponse对象
    
    process_response(self, request, response)​  # 视图函数的响应对象;在所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
    
    process_template_response(self,request,response)  # 在视图函数执行完毕,且视图函数返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
    
    注意:中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时,表示此请求结束,直接返回给客户端
  4. 中间件的编写
    # 校验请求是否合法
    
    from django.utils.deprecation import MiddlewareMixin
    from conf.config import AUTHTOKEN
    
    class MWare(MiddlewareMixin):
       def process_request(self,request):
           if request.META.get('HTTP_AUTHTOKEN') != AUTHTOKEN:
                return HttpResponse("Forbidden", status=403)
    
    # 在setting.py文件中注册该中间件
    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',
        "middleware.auth.AuthTokenCheck",
    ]​
    
    ​

 

 

0条评论
0 / 1000
孟****强
4文章数
0粉丝数
孟****强
4 文章 | 0 粉丝