发新话题
打印

[转贴] django 中间件的汇总,新手多看看。。。

[转贴] django 中间件的汇总,新手多看看。。。

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

如果你要在用户登录或者其它的处理过程中完成自己的一些处理,那django 中间件非常的合适,感觉和django form一样,提倡这种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.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware',)
Django安装部需要任何中间件--例如MIDDLEWARE_CLASSES可以为空,如果你想这样的话--但是强烈建议你使用CommonMiddle
ware
顺序是有意义的,在请求和视图阶段,Django使用MIDDLEWARE_CLASSES给定的顺序申请中间件,而在应答和异常阶段,Djang
o使用相反的顺序申请中间件,即Django把MIDDLEWARE_CLASSES当作一种视图方法的"包装器":在请求时,它自顶向下申请这
个列表的中间件到视图,而在应答时它反序进行.

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

视图预处理rocess_view(self, request, view, args, kwargs)
该方法在请求中间件运行后和URL被解析到一个视图后和视图实际上被调用之前被调用
传递给该视图的参数为:
Argument Explanation
request HttpRequest对象
view Django将会调用来树立该请求的Python方法,它是实际上的方法对象本身,而不是方法名字符串
args 将被传递给视图的位置参数列表,不包括request参数(它一直是视图的第一个参数)
kwargs 将被传递给视图的关键字参数字典
像process_request()一样,process_view()应该返回None或者HttpResponse对象,如果它返回None,Django将继续处理请求
执行任何其它的视图中间件然后是合适的视图
如果视图中间件返回HttpResponse对象,Django将不会再调用其它任何中间件或者合适的视图,它将返回该应答

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

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

比如我们写了个例子

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

然后MyAuthenticationMiddleware定义的方法是:

class LazyMember(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_admin'):
from apps.auth import get_member
request._cached_admin = get_member(request)
return request._cached_admin

class MyAuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session')
request.__class__.admin = LazyMember()
return None

最后总结一下django 中间件不是很难,用一下就应该比较清楚了。老王其实也只是用了一点点django 中间件的知识,如果有朋友熟悉的话,可以在python论坛里讨论。
http://www.csvt.net/

TOP

发新话题