3

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

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

4

2 回答 2

1

为什么你想把它作为一个 WSGI 中间件来做呢?Django 在这些方面运行得不是特别好 - 几年前有一些工作试图将 Django 中间件与 WSGI 中间件协调起来,但它并没有真正取得任何进展。

Django 有自己的中间件版本,文档非常详细,您的请求可以在大约三行内完成。

于 2013-04-08T12:35:43.740 回答
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从此方法返回一个实例,则不会调用视图。由于HttpResponseForbidden是 的子类HttpResponse,因此如果用户未通过身份验证,则不会调用视图。

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

设置.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',
)
于 2013-04-14T19:49:50.510 回答