我正在尝试在Django项目中包括一个中间件,但是似乎中间件没有被Django执行。这个想法是在拥有应用程序管理员权限时模拟另一个用户帐户。
settings.py文件的MIDDLEWARE部分如下所示:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'mird_project.monitor.middleware.impersonateMiddleware.ImpersonateMiddleware',
]
中间件类如下:
from .models import Usuario
class ImpersonateMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_request(self, request):
us_obj = Usuario.objects.all().filter(id_usuario=request.user.username).first()
tipo = us_obj.tipo.id_tipo
if tipo == "AD" and "__impersonate" in request.GET:
request.session['impersonate_id'] = request.GET["__impersonate"]
elif "__unimpersonate" in request.GET:
del request.session['impersonate_id']
if tipo == "AD" and 'impersonate_id' in request.session:
request.user = Usuario.objects.get(id_usuario=request.session['impersonate_id'])
return None
我在assert False, request
方法中插入了process_request
,这样它就会异常中止执行,并告诉我包含了什么请求。它甚至从未执行,因此我假设中间件永远不会执行。它不会引发任何类型的错误,并且模拟机制只是在站点中显示同一管理员用户。
有什么想法为什么没有调用中间件?
答案 0 :(得分:0)
您似乎正在混合使用新旧风格的中间件API。 process_request()
方法是Django 1.10之前的版本,除非您的中间件类使用MiddlewareMixin,否则不会自动调用。
您需要通过process_request()
方法自己调用__call__()
:
def __call__(self, request):
self.process_request(request) # Call process_request()
response = self.get_response(request)
return response
或者,您也可以从MiddlewareMixin
继承,以便process_request()
由Django调用。但是,只有在需要使中间件向后兼容的情况下,这样做才有意义。