如何为django定义自定义wsgi中间件

时间:2013-04-08 12:32:17

标签: django

我想编写一个自定义的wsgi中间件,每次传入的请求都会调用它。它检查URL,以及用户是否经过身份验证并允许请求继续或拒绝它。

在django中添加wsgi中间件的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

为什么要将此作为WSGI中间件执行此操作? Django的运行效果不是很好 - 几年前有一些工作试图将Django中间件与WSGI中间件协调起来,但它并没有真正实现。

Django有自己的中间件版本,very well documented,您的请求可以在大约三行中完成。

答案 1 :(得分:0)

这里不需要wsgi中间件,可以轻松使用django中间件。

some_app / middleware.py

from django.http import HttpResponseForbidden

class AuthenticateMiddleware(object):

    def process_request(self, request):
        #do something with request.path
        if request.user.is_authenticated():
            #can do something or just pass
            #but do not return a response from here
        else:
            #return a response from here so that view doesn't get called
            return HttpResponseForbidden()
在处理process_request()之前,会调用任何中间件的

view。如果从此方法返回HttpResponse的实例,则不会调用该视图。由于HttpResponseForbiddenHttpResponse的子类,因此如果用户未经过身份验证,则不会调用该视图。

您需要将此自定义中间件添加到MIDDLEWARE_CLASSES。

settings.py

MIDDLEWARE_CLASSES = ( 
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'some_app.middleware.AuthenticationMiddleware',
)