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

如何为django定义自定义wsgi中间件,django,Django,我想编写一个定制的wsgi中间件,它在每个传入请求上都被调用。它检查url,以及用户是否经过身份验证并允许请求继续或拒绝请求 在django中添加wsgi中间件的最佳方式是什么?具体来说,为什么要作为wsgi中间件来执行此操作?Django并不能很好地处理这些问题——几年前曾有一些工作尝试将Django中间件与WSGI中间件协调起来,但实际上并没有取得任何进展 Django有自己的中间件版本,也就是说,您的请求可以在大约三行中完成。您在这里不需要wsgi中间件,可以轻松使用Django中间件 一

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


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

具体来说,为什么要作为wsgi中间件来执行此操作?Django并不能很好地处理这些问题——几年前曾有一些工作尝试将Django中间件与WSGI中间件协调起来,但实际上并没有取得任何进展


Django有自己的中间件版本,也就是说,您的请求可以在大约三行中完成。

您在这里不需要wsgi中间件,可以轻松使用Django中间件

一些_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\u request()
。如果从该方法返回
HttpResponse
的实例,则不会调用该视图。由于
HttpResponseForbidden
HttpResponse
的子类,因此如果用户未经过身份验证,则不会调用该视图

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

设置.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',
)