Django中Middleware中间件

1 Middleware中间件概述

  1. django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法。实际上当我们想在发起请求到服务器views处理函数,我们想对请求做一些提前处理,此时中间件就上场了。
  2. djangosettings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件。
  3. settings.py文件中:
  4. MIDDLEWARE = [
  5. 'django.middleware.security.SecurityMiddleware',
  6. 'django.contrib.sessions.middleware.SessionMiddleware',
  7. 'django.middleware.common.CommonMiddleware',
  8. 'django.middleware.csrf.CsrfViewMiddleware',
  9. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  10. 'django.contrib.messages.middleware.MessageMiddleware',
  11. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  12. 'django.middleware.DataConvert'
  13. '自定义中间件添加位置'
  14. ]
  15. 常见的middleware组件:
  16. 1. Sessions
  17. 2. Authentication
  18. 3. CSRF Protection
  19. 4. GZipping Content

2 Middleware处理功能

  1. Djano中,中间件承担作用 Resquest---->Middleware ---->View----->Response
  2. 比如如果想实现接入安全验证,middleware是比较好的选择,是连接requestview的桥梁
  3. Django中支持的中间件可以实现如下方法:
  4. 方法名称 执行周期
  5. process_request 接受到request之后,但在确定View之前
  6. process_view 确定view之后,但真正执行view之前
  7. process_response 执行view之后
  8. process_exception view抛出异常之后
  9. 详解: 每个请求都是先通过中间件process_request函数,这个函数返回None或者HttpResponse对象,返回前者继续处理其他中间件,返回HttpResponse,处理终止返回网页内容.每个中间件都是按照顺序依次进入处理程序.

3 自定义中间件Middleware

  1. 我们网站放在服务器正式运行之后,DEBUG改为False,这样更加安全,但有时候发生错误不能显示错误详情页面,普通用户看到的是友好的报错信息,管理员看到的是错误详情,以便于修复BUG,为达到两者效果,利用middleware就能做到.下面我们看下我们定义的Middleware:
  2. import sys
  3. from django.views.debug import technical_500_response
  4. from django.conf import settings
  5. class UserBasedExceptionMiddleware(object):
  6. def process_exception(self, request, exception):
  7. if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
  8. return technical_500_response(request, *sys.exc_info())
  9. 在给大家展示一个有用的例子,我们都知道浏览器发送数据仅支持GETPOST两种请求方式,那我们是怎么实现PUT,DELETE,OPTIONS请求的功能的呢? 下面我们将展示采用中间件将request中的请求信息进行转化的方法:
  10. PUT/DELETE/OPTIONS方法的转换中间件:
  11. import json
  12. from django.utils.deprecation import MiddlewareMixin
  13. from django.http.multipartparser import MultiPartParser
  14. class MethodConvertMiddleware(MiddlewareMixin):
  15. #创建请求处理函数
  16. def process_request(self,request):
  17. method = request.method
  18. #判断请求请求头信息中content-type是否含有application/json
  19. if 'application/json' in request.META['CONTENT_TYPE']:
  20. #json格式转Python字典
  21. data = json.loads(request.body.decode()
  22. #判断请求请求头信息中content-type是否含有mutipart/form-data
  23. elif 'mutipart/form-data' in request.META['CONTENT_TYPE']:
  24. #解析器解析出data与文件
  25. data,files = MultiPartParser(request.META,request,request.upload_handlers).parse()
  26. else:
  27. #这里不支持application/x-www-form-urlencoded,其余返回{}
  28. data = {}
  29. files = None
  30. #前段讲请求方式放在HTTP_X_METHOD
  31. if 'HTTP_X_METHOD' in request.META:
  32. method = request.META['HTTP_X_METHOD'].upper()
  33. #例如设定method = 'PUT'
  34. setattr(request,'method',method)
  35. if files:
  36. #files存在 request.PUT_FILES = files 数据data也设置给PUT,这样就转换过来了
  37. setattr(request,'{method}_FILES'.format(method=method),files)
  38. setattr(request,method,data)
  39. #中间件进入下一个处理程序
  40. return None
  41. 注:1 中间件没有添加异常处理程序,可自行添加.
  42. 2 中间件只针对两种常见数据类型格式application/json application/form-data.

Django中Middleware中间件的更多相关文章

  1. Django中的中间件(middleware)

    中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...

  2. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  3. Django 中的中间件

    Django 中的中间件 Django  中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...

  4. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  5. django中的中间件

    中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责 ...

  6. django中的中间件机制和执行顺序

    这片文章将讨论下面内容: 1.什么是middleware 2.什么时候使用middleware 3.我们写middleware必须要记住的东西 4.写一些middlewares来理解中间件的工作过程和 ...

  7. Django之Middleware中间件方法使用

    自定义中间件五个方法(部分方法)实例 自定义中间件项目: 模板Templates login.html {% load static %} <!DOCTYPE html> <html ...

  8. 基于django中settings中间件源码思想,实现功能的插拔式设计

    这里我们用到一个非常重要的模块,importlib,利用它可以实现字符串转python代码,再利用反射进行操作,这样就可以实现插拔式设计. 一.我们先做个初级的,把所有文件放到初级思想文件夹下: 1. ...

  9. RBAC在Django中基于中间件的AJAX应用案例

    项目文件:   models.py from django.db import models from django.contrib.auth.models import AbstractUser # ...

随机推荐

  1. Factory Method (工厂模式)

    什么是工厂设计模式 根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH.SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我 ...

  2. 如何使用php生成唯一ID的4种方法

    php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...

  3. 0510JS运算符

    |-运算符|--基础运算符 + - * / %|----加号:数字的求和.字符串的拼接|----减号:数字的减法.对数字取反|----乘法.除法.取余 var a = 10; var b = 10; ...

  4. C#备份及还原数据库的实现

    使用前要导入SQLDMO.dll 下载地址:http://down.51cto.com/data/853937 1.在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所 ...

  5. 实现MyArrayList类深入理解ArrayList

    ArrayList简介 ArrayList是一个动态数组,Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处. MyArray ...

  6. 基于DP的矩阵连乘问题

    当多个连续可乘矩阵做乘法时,选择正确的做乘顺序可以有效减少做乘法的次数,而选择的方法可以很容易的通过DP实现. 原理就是对于每一个所求矩阵,搜索所有可以相乘得到它的方法,比较它们的消耗,选取最小值作为 ...

  7. Flask请求扩展和数据库连接池

    1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...

  8. Python学习 Part6:错误和异常

    Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...

  9. 第七章之S5PV210移植到Nandflash

    1,之前的操作都是基于SD卡进行运行的,如今在Nandfalsh中运行u-boot.因为s5p_goni.h配置文件没有配置Nand相关文件,所以先配置Nand文件. 在include/configs ...

  10. Win32项目生成的程序exe图标显示异常的问题

    问题 如图: 用VS2013生成exe执行文件时发现的问题,起初以为是没添加ico图像的最小尺寸,后来查看ico并不是这个问题. Baidu.Google了半天找到原因:文件资源管理器的图标缓存bug ...