Промежуточное программное обеспечение не выполнено Джанго - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь включить промежуточное ПО в проект Django, но кажется, что промежуточное ПО не выполняется Django. Идея состоит в том, чтобы выдавать себя за другую учетную запись пользователя, если у него есть права администратора приложения.

Секция MIDDLEWARE моего файла settings.py выглядит так:

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 голосов
/ 17 января 2019

Похоже, вы смешиваете старый и новый стиль промежуточного 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(). Однако это будет иметь смысл только в том случае, если вам нужно сделать промежуточное ПО обратно совместимым.

...