【Django】中间件
Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以后直接返回 Response。因此了解中间件的构成是非常必要的。
Initializer: __init__(self)
出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化一次。也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个 request 处理时并不执行。
对一个 middleware 而言,定义 __init__() 方法的通常原因是检查自身的必要性。如果 __init__() 抛出异常 django.core.exceptions.MiddlewareNotUsed ,则 Django 将从 middleware 栈中移出该 middleware。
在中间件中定义 __init__() 方法时,除了标准的 self 参数之外,不应定义任何其它参数。
Request预处理函数: process_request(self, request)
这个方法的调用时机在 Django 接收到 request 之后,但仍未解析URL以确定应当运行的 view 之前。Django 向它传入相应的 HttpRequest 对象,以便在方法中修改。
process_request() 应当返回 None 或 HttpResponse 对象。
如果返回 None ,Django 将继续处理这个 request,执行后续的中间件, 然后调用相应的 view。
如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(无视其种类)以及相应的view。 Django将立即返回该 HttpResponse。
View预处理函数: process_view(self, request, callback, callback_args, callback_kwargs)
这个方法的调用时机在 Django 执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。
- request:HttpRequest 对象。
- callback:Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。
- args:将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数)。
- kwargs:将传入view的关键字参数字典。
如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view。
如果返回 HttpResponse 对象,Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view,Django将立即返回。
Response后处理函数: process_response(self, request, response)
这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。
该处理器能修改 response 的内容;一个常见的用途是内容压缩,如 gzip 所请求的 HTML 页面。
这个方法的参数相当直观: request 是 request 对象,而 response 则是从 view 中返回的 response 对象。
process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
Exception后处理函数: process_exception(self, request, exception)
这个方法只有在 request 处理过程中出了问题并且 view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。
这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。
process_exception() 应当返回 None 或 HttpResponse 对象。
如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。
如果返回 HttpResponse 对象,Django 将使用该response对象,而短路框架内置的异常处理机制。
【Django】中间件的更多相关文章
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- django 中间件
django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- Django学习之七:Django 中间件
目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...
- Django中间件的使用
Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应 ...
- Django中间件 及 form 实现用户登陆
Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...
- Django 2.0 学习(20):Django 中间件详解
Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...
- Django中间件的5种自定义方法
阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前 和视图函 ...
- Python自动化之Django中间件
django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...
- Django中间件如何处理请求
Django中间件 在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1. ...
随机推荐
- 从《海贼王》的视角走进BAT的世界(百度/阿里/腾讯)
在伟大航路后半段--新世界,有三位君临天下的海上枭雄,就犹如海上皇帝一般,被人们称为"三皇",他们是--洛宾·里(Robin·Li),杰克·马(Jack·Ma)和波尼(pony)! ...
- 14.Java中的Future模式
jdk1.7.0_79 本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...
- react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错
调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...
- C++数组概述
C++数组概述 基本概念 1. 数组是固定大小的一种复合类型 因为数组是固定大小,所以在编译期间就决定了基大小 数组的内存是连续(无论是一维数组还是多维数组) 2. 数组的特性 数组之间不允许拷贝和赋 ...
- 总结一下最近用过的phpcms语法
到目前为止用到过的phpcms语法: 1.取栏目名称: {category[$catid][catname]} 2.取栏目地址: {category[14][url]} 3.取一级栏目: {pc:co ...
- php中比较两个变量是否相等的最高效写法
<?php //php中比较两个变量是否相等的最高效写法 function isEqual($a,$b){ return $a==$b; } var_dump(isEqual(3,3));//t ...
- php中的命名空间
a.php <?php namespace a\b; class Apple{ function get_info(){ echo 'aaa'.'<br/>'; } } ?> ...
- 怎么样刷新frameset的整个页面
<a href="main.html?a=2" target="_parent">? 设置a链接的target属性值为_parent即可
- <canvas合成海报>所遇问题及解决方案总结
最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下: 1.移动端canv ...
- HTML5 进阶系列:文件上传下载
前言 HTML5 中提供的文件API在前端中有着丰富的应用,上传.下载.读取内容等在日常的交互中很常见.而且在各个浏览器的兼容也比较好,包括移动端,除了 IE 只支持 IE10 以上的版本.想要更好地 ...