Django不执行中间件

时间:2019-01-17 00:50:09

标签: django middleware

我正在尝试在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,这样它就会异常中止执行,并告诉我包含了什么请求。它甚至从未执行,因此我假设中间件永远不会执行。它不会引发任何类型的错误,并且模拟机制只是在站点中显示同一管理员用户。

有什么想法为什么没有调用中间件?

1 个答案:

答案 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调用。但是,只有在需要使中间件向后兼容的情况下,这样做才有意义。