Django中间件简介
中间件是Django处理请求和响应处理过程中的一个钩子,它比较轻量级,但是可以用来改变Django全局的的输入和输出。
每一个中间件一般都用来做一些特殊的功能,可以添加多个中间件来实现更多的功能。
今天一起看一下Django的中间件是如何工作的,如何激活,并且自己写一个中间件。Django还内置了一些中间件,可以拿来即用。参考内置中间件
中间件写法参考
中间件可以以函数的形式来写,如下:
def simple_middleware(get_response): # One-time configuration and initialization. # 配置和初始化的工作,只执行一次 def middleware(request): # Code to be executed for each request before # the view (and later middleware) are called. # 在view被调用之前,请求还未加工时执行 response = get_response(request) # Code to be executed for each request/response after # the view is called. # 在请求/响应处理完毕后调用的代码 return response return middleware
- 函数必须传递的参数为
get_response
- 返回值必须为
middleware
除了函数形式为,更多的写法一般是写成类的形式。
class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. # 代码初始化时候执行,可以做一次性的配置 def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. # 在view被调用之前,请求还未加工时执行 response = self.get_response(request) # Code to be executed for each request/response after # the view is called. # 请求/响应被处理之后执行 return response
-
__init__
方法只执行一次 -
__call__
方法可以执行多次
标记中间件为不可用状态
有时候,你想在项目启动时判断是否要用这个中间件,这种情况下,在你的init方法中,抛出MiddlewareNotUsed异常。Django就会移除这个中间件,如果有日志开启的话,DEBUG=True
, 你也可以看到日志输出的信息。
激活中间件
如果要激活一个中间件,把它添加到项目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', 'libs.middleware.HandleExceptionMiddleware', # 处理视图函数异常 ]
建议至少使用一个中间件,django.middleware.common.CommonMiddleware
中间件的顺序也很重要,有时候某个中间件需要依赖另外一个中间件的执行结果才可以生效。例如:AuthenticationMiddleware
存储用户的认证信息在Session中,因此它必须在SessionMiddleware.
中间件之后。
中间件的执行顺序是从数组的,从上往下
执行。但是对于响应则是从下往上执行。
中间件的其它钩子
除了基本的请求/响应处理的那个中间件,你还可以添加另外三个特殊的方法。
- process_view(request, view_func, view_args, view_kwargs) 在Django调用view之前执行,可以返回None或者HttpResponse对象。如果返回的是None,Django会继续执行直到找到合适的视图为止,如果返回的是HttpResponse对象,Django就停止执行,然后返回HttpResponse结果。
process_exception(request, exception) 当view抛出异常的时候,会触发Django调用这个函数。可以返回None或者HttpResponse对象。同上面
process_template_response(request, response) 当view结束执行的时候调用,如果响应有
render()
方法,代表它是个 TemplateResponse。这个函数必须要返回一个响应对象有render()
方法。
最后
中间件还有很多功能,等待大家一起去发掘。
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何提高阿里云上应用的可用性(二)
这是如何提高阿里云上应用的可用性系列文章的第二篇,第一篇传送门。 在单体应用时代,最大的问题是如何解决数据库瓶颈,而微服务之下,一个大应用被拆分成了几十个甚至上百个微服务,数据访问的压力被传导到了服务之间的网络,服务强弱依赖,服务雪崩等各种问题随之而来,那么如何保障服务的可用性以及整个应用的健壮性呢?常见的做法包括: 超时 程序员和女朋友约会在楼下等她的时候一般都会约定 “等你30分钟啊”, 这就是一种超时约定,如果等了半小时女朋友还没有下来,该怎么办?一般有服务治理意识的程序员都会选择超时退出及时止损(不知道这是不是程序员没有女朋友的原因之一) 在应用设计中,为避免集群雪崩或资源耗尽,一切调用都应该设置超时时间,包括RPC/DB/缓存,服务端超时是必选配置。在实际的电商实际场景中,一般服务级别的超时时间通常会设置在100ms~300ms
- 下一篇
分享我如何在7年时间里成长为阿里Java架构师(附学习路线图)
如何更高效的学习? 1.架构师应不应该写代码 合格的程序员对于明确分配的任务会完成的很好,但是大部分情况下“架构”这个词意味着架构师并不会涉及太多细节,架构图和代码实现之间总还是有些距离,你无法保证所有人都会正确的理解你的设计,或者是程序员写代码时遇到障碍时会立刻想出足够优雅的解决方案。 在我看来,写代码的架构师更像是在做后勤保障的工作:在代码中第一时间发现可能存在的问题,向其他人提出警告,或是给予其他人改进的意见,必要的时候或是给其他人演示一下正确的姿势。 大部分情况下我作为架构师并不需要揽下“核心模块”开发这种工作,毕竟我能调配的时间太零散了,效率难以保证,很多人在专注的情况下比我做的好很多,我只需要保持大局观需要适度参与就可以了。 总的来说,架构师和程序员在某些方面上有点像产品经理和用户的关系,大部分程序员并不会主动告诉你他们想要什么、哪里需要优化,甚至自己也不知道这些。想要做出好的产品,捷径之一就是跟用户做同样的事情。 2.为什么别人的系统总是那么烂 很多程序员解决问题的能力很强,说要解决一个什么问题,下午就能写出几百行代码把功能实现了。但是做出来的东西有种少考虑了什么东西的感...
相关文章
文章评论
共有0条评论来说两句吧...