django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的。所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Response,那么我们可以简化原来的设计思路,把中间件不能处理的 Request统统不管,丢给Django去处理。

如果你要在用户登录或者其它的处理过程中完成自己的一些处理,比如进行权限控制,对返回结果作一些处理,可以使用python的修饰器,但有个缺点就是要在每个视图前面都添加修饰器,当初我就是这么做的,太累了。后来发现 django 中间件非常棒,可以进行全局控制,而且可以提高性能。提倡这种dry的哲学风格设计非常的有意思,

先说下django 中间件的安装方法:

为了激活中间件组件,把它添加到你的settings模块的MIDDLEWARE_CLASSES列表中,在MIDDLEWARE_CLASSES里,每个中间件组件通过一个字符串来表示:完整的到中间件的类名的Python路径,例如,这里是通过django-admin.py startproject创建的

默认的MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#'decorators.middleware.DecoratorsMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

Django安装部需要任何中间件--例如MIDDLEWARE_CLASSES可以为空,如果你想这样的话--但是强烈建议你使用CommonMiddleware 顺序是有意义的,在请求和视图阶段,Django使用MIDDLEWARE_CLASSES给定的顺序申请中间件,而在应答和异常阶段,Django使用相反的顺序申请中间件,即DjangoMIDDLEWARE_CLASSES当作一种视图方法的"包装器",在请求时,它自顶向下申请这个列表的中间件到视图,而在应答时它反序进行.

再说下django 中间件的定义方法:

* 请求预处理:process_request(self, request) :

该方法在请求被接收和URL被解析来决定运行哪个视图之前立即调用,它传递你可能想修改的HttpRequest对象 process_request()应该返回None或者HttpResponse对象,如果它返回None,Django将继续处理该请求,执行任何其它的中间件然后是合适的视图。如果请求中间件返回HttpResponse对象,Django将不会再调用其它任何中间件(任何类型)或者合适的视图,它将返回该应答。

* 视图预处理:process_view(self, request, view, args, kwargs) :

该方法在请求中间件运行后和URL被解析到一个视图后和视图实际上被调用之前被调用,

参数说明:

* request HttpRequest对象

            * view, Django将调用来执行该请求的视图函数,它是实际上的方法对象本身,而不是方法名字符串

            * args 将被传递给视图的位置参数列表,不包括request参数(它一直是视图的第一个参数) 

            * kwargs 将被传递给视图的关键字参数字典 

        像process_request()一样,process_view()应该返回None或者HttpResponse对象,如果它返回None,Django将继续处理请求执行任何其它的视图中间件然后是合适的视图,如果视图中间件返回HttpResponse对象,Django将不会再调用其它任何中间件或者合适的视图,它将返回该应答

* 应答后处理:process_response(self, request, response) 
       
该方法在视图方法已经调用和应答生成后调用,这是中间件修改应答输出的地方,输出压缩(见下)是应答中间件的一个显然的应用参数应该非常自明了--request是请求对象,response是从视图返回的应答对象不像请求和视图中间件,它们可以返回None,process_response()必须返回一个HttpResponse对象,该应答可以是传递给该 
方法的原始应答(可能被修改了)或者新的应答

* 异常后处理:process_exception(self, request, exception) 
   
     该方法只在出错并且视图触发不可捕获的异常时调用,不包括Http404异常,你可以使用这个钩子来发送错误通知,在一个日志文件记录信息,或者甚至尝试自动恢复该错误。该方法的参数是我们一直处理的同样的request对象和视图方法触发的真正的Exception对象exception。process_exception()可能返回一个作为应答显示给浏览器的HttpResponse或者返回None来继续Django内建的异常处理。

比如我们写了个例子

MIDDLEWARE_CLASSES = (
    'apps.auth.middleware.DecoratorsMiddleware',    
)

然后DecoratorsMiddleware定义的方法是:

#coding=utf-8

import urllib
from django.template import RequestContext
from django.shortcuts import render_to_response class DecoratorsMiddleware(object):
"""
如果返回的对象是字典,就对它进行处理
""" def process_response(self, request, response):
if type(response) == dict:
param_dict = {}
for k,v in request.GET.items():
if k == 'last_id':
param_dict['last_id'] = response['ret'].get('last_id','')
else:
param_dict[k] = v.encode('utf-8')
if not param_dict.get('last_id'):
param_dict['last_id'] = response['ret'].get('last_id','') response['ret']['params'] = urllib.urlencode(param_dict)
response['ret'] = dict(response['ret'], **param_dict)
return render_to_response(
response['template'],
response['ret'],
RequestContext(request, {}),
)
return response

最后总结一下django 中间件不是很难,用一下就应该比较清楚了。

django 中间件的更多相关文章

  1. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  2. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  3. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  4. Django中间件的使用

    Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应 ...

  5. Django中间件 及 form 实现用户登陆

    Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

  6. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  7. Django中间件的5种自定义方法

    阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前   和视图函 ...

  8. Python自动化之Django中间件

    django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...

  9. Django中间件如何处理请求

    Django中间件 在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1. ...

随机推荐

  1. 如何在Xcode6中添加空模板

    在Xcode中模板位置: Macintosh HD ▸ 应用程序 ▸ Xcode(低于版本6的).app ▸ Contents ▸ Developer ▸ Platforms ▸ iPhoneOS.p ...

  2. 重新发现梯度下降法--backtracking line search

    一直以为梯度下降很简单的,结果最近发现我写的一个梯度下降特别慢,后来终于找到原因:step size的选择很关键,有一种叫backtracking line search的梯度下降法就非常高效,该算法 ...

  3. HMM MEMM & label bias

    (http://blog.csdn.net/xum2008/article/details/38147425) 隐马尔科夫模型(HMM): 图1. 隐马尔科夫模型 隐马尔科夫模型的缺点: 1.HMM只 ...

  4. Ubuntu下的防火墙

    Ubuntu下的防火墙Gufw-ufw Gufw是ufw的桌面版本,网上有Gufw的安装和配置方法,但是我认为并不是很好.网上的教程也有点愚弄大众的嫌疑,因为按照他的说法,最后防火墙根本就无法自动启动 ...

  5. Android代码截屏

    本文来源:http://myhpu2008.iteye.com/blog/999779 这种方法应该只能对当前Activity本身进行截屏,因而你只能在你应用程序中参照该代码对其应用程序本身截屏. i ...

  6. 发布大幅重构优化的 TouchVG 1.0.2

    发布大幅重构优化的 TouchVG 1.0.2,支持SVG.多模块扩展结构,欢迎评阅改进.提交pull request. https://github.com/rhcad/touchvg 关于 Tou ...

  7. 转:探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法

    前言 相信这样一个问题,大家都不会陌生, “有什么的方法可以使Android的程序APK不用安装,而能够直接启动”. 发现最后的结局都是不能实现这个美好的愿望,而腾讯Android手机游戏平台却又能实 ...

  8. mysql 语句case when

    CREATE TABLE `lee` (`id` int(10) NOT NULL AUTO_INCREMENT, `name` char(20) DEFAULT NULL, `birthday` d ...

  9. html5 audio/video 的那些坑

    当我最近项目用到audio的时候,我们用到了jPlayer作为三方库. 功能实现了,暂停播放,进度条什么的,都很顺利的搞定了.后来考虑到当网速过慢时需要给播放按钮一个载入动画,然后就一发不可收拾了. ...

  10. GPUImage滤镜之锐化

    应用锐化工具可以快速聚焦模糊边缘,提高图像中某一部位的清晰度或者焦距程度,使图像特定区域的色彩更加鲜明. 在应用锐化工具时,若勾选器选项栏中的“对所有图层取样”复选框,则可对所有可见图层中的图像进行锐 ...