我想编写一个自定义的 wsgi 中间件,在每个传入的请求上都会调用它。它检查 url,以及用户是否已通过身份验证并允许请求继续或拒绝它。
在 django 中添加 wsgi 中间件的最佳方法是什么?
我想编写一个自定义的 wsgi 中间件,在每个传入的请求上都会调用它。它检查 url,以及用户是否已通过身份验证并允许请求继续或拒绝它。
在 django 中添加 wsgi 中间件的最佳方法是什么?
为什么你想把它作为一个 WSGI 中间件来做呢?Django 在这些方面运行得不是特别好 - 几年前有一些工作试图将 Django 中间件与 WSGI 中间件协调起来,但它并没有真正取得任何进展。
Django 有自己的中间件版本,文档非常详细,您的请求可以在大约三行内完成。
这里不需要 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',
)