django的middleware执行顺序

28 11月, 2006 (13:22) | django

今天总算弄清了django中的middleware执行顺序是什么了,假设我的settings.py中设置的middleware顺序如下:

MIDDLEWARE_CLASSES = (
    "django.middleware.common.CommonMiddleware",
    "django.contrib.csrf.middleware.CsrfMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.transaction.TransactionMiddleware",
 )

那么,在处理request的时候顺序是从上往下的,即CommonMiddleware的process_request方法最先执行,最后执行的是TransactionMiddleware的process_request。
但是处理response的顺序正相反,TransactionMiddleware的process_response方法先被调用,最后被调用的是CommonMiddleware的process_response方法,类似后进先出的堆栈。

还有一点要注意的是,CommonMiddleware的process_request方法里面有对url进行处理,处理之后就redirect了,那么之后下面的middleware的process_request就不会再执行了,而是调用process_response方法(顺序是从下往上)

在写middleware的时候犯了很多错误,这个middleware的执行顺序问题被review了两遍才认识到,记下来免得以后犯同样的错误。

Write a comment