Django中Middleware中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中提前处理,此时中间件就上场了。

1 Middleware中间件概述

    django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中
提前处理,此时中间件就上场了。

django在settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件。
在settings.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',
    'django.middleware.DataConvert''自定义中间件添加位置'
]

常见的middleware组件:
1. Sessions     
2. Authentication   
3. CSRF Protection 
4. GZipping Content

2 Middleware处理功能

在Djano中,中间件承担作用   Resquest---->Middleware ---->View----->Response
比如如果想实现接入安全验证,middleware是比较好的选择,是连接request与view的桥梁
Django中支持的中间件可以实现如下方法:

    方法名称            执行周期
    process_request     接受到request之后,但在确定View之前
    process_view        确定view之后,但真正执行view之前
    process_response    执行view之后
    process_exception   view抛出异常之后

详解: 每个请求都是先通过中间件process_request函数,这个函数返回None或者
HttpResponse对象,返回前者继续处理其他中间件,返回HttpResponse,处理终止返回网页内
.每个中间件都是按照顺序依次进入处理程序.

3 自定义中间件Middleware


    我们网站放在服务器正式运行之后,DEBUG改为False,这样更加安全,但有时候发生错误不能
显示错误详情页面,普通用户看到的是友好的报错信息,管理员看到的是错误详情,以便于修复
BUG,为达到两者效果,利用middleware就能做到.下面我们看下我们定义的Middleware:
import sys
from django.views.debug import technical_500_response
from django.conf import settings

class UserBasedExceptionMiddleware(object):
   def process_exception(self, request, exception):
       if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
           return technical_500_response(request, *sys.exc_info())

    在给大家展示一个有用的例子,我们都知道浏览器发送数据仅支持GET和POST两种请求方式,
那我们是怎么实现PUT,DELETE,OPTIONS请求的功能的呢?  
下面我们将展示采用中间件将request中的请求信息进行转化的方法:

PUT/DELETE/OPTIONS方法的转换中间件:

import json
from django.utils.deprecation import MiddlewareMixin
from django.http.multipartparser import MultiPartParser

class MethodConvertMiddleware(MiddlewareMixin):
    #创建请求处理函数
    def process_request(self,request):
        method = request.method
        #判断请求请求头信息中content-type是否含有application/json

        if 'application/json' in request.META['CONTENT_TYPE']:
            #json格式转Python字典
            data = json.loads(request.body.decode()
        #判断请求请求头信息中content-type是否含有mutipart/form-data

        elif 'mutipart/form-data' in request.META['CONTENT_TYPE']:
            #解析器解析出data与文件
            data,files = MultiPartParser(request.META,request,request.upload_handlers).parse()
        else:
            #这里不支持application/x-www-form-urlencoded,其余返回{}
            data = {}
            files = None
        #前段讲请求方式放在HTTP_X_METHOD
        if 'HTTP_X_METHOD' in request.META:
            method = request.META['HTTP_X_METHOD'].upper()
            #例如设定method = 'PUT'
            setattr(request,'method',method)
        if files:
            #files存在 request.PUT_FILES = files  数据data也设置给PUT,这样就转换过来了
            setattr(request,'{method}_FILES'.format(method=method),files)
        setattr(request,method,data)
        #中间件进入下一个处理程序
        return None
注:1  中间件没有添加异常处理程序,可自行添加.
   2  中间件只针对两种常见数据类型格式application/json 与 application/form-data.
相关文章
|
4月前
|
中间件 程序员 开发工具
Django实践-08中间件的应用
Django实践-08中间件的应用
Django实践-08中间件的应用
|
8月前
|
前端开发 中间件 数据安全/隐私保护
【Django】创建用户,中间件,表单组件
【Django】创建用户,中间件,表单组件
47 0
|
8月前
|
XML 中间件 数据格式
Django 高级指南:深入理解和使用类视图和中间件
Django 是一款强大的 Python Web 框架,它提供了一套完整的解决方案,让我们能够用 Python 语言快速开发和部署复杂的 Web 应用。在本文中,我们将会深入研究 Django 中的两个高级特性:类视图(Class-Based Views)和中间件(Middleware)。
|
4月前
|
缓存 中间件 Python
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
|
4月前
|
小程序 中间件 PHP
laravel5.8(六)中间件(middleware)
中间件,第一次听到这个名字感觉好陌生,这是个啥呀,第三方插件?好像不是。之前也没有遇到过这个玩意啊。 之前使用到的thinkphp5.0以及Yii2.0框架都是没有中间件这一说的。 去thinkphp官网查了一下,要到thinkphp5.1.6才开始支持中间件。实现的方式基本上就是仿照laravel。 一:那么什么时中间件呢: HTTP 中间件提供了为过滤进入应用的 HTTP 请求提供了一套便利的机制。 例如,Laravel 内置了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作。
45 0
|
5月前
|
中间件 Python
25 Django高级- 中间件
25 Django高级- 中间件
27 0
|
6月前
|
中间件
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
70 1
|
8月前
|
中间件 Python
|
8月前
|
中间件 Python
|
8月前
|
中间件 开发者 Python
[Python]Django中间件
[Python]Django中间件