Ошибка вызова процессора контекста Django при перенаправлении

Я использую следующий процессор контекста для передачи контекста всем своим страницам, за исключением случаев, когда пользователь не вошел в систему, и в этом случае он переводит его на страницу входа:

from django.conf import settings
from .models import foo
from django.shortcuts import redirect


def globalVar(request):
    if not request.session.get('user_id') is None:
        return {"foo": foo}
    else:
        return redirect('login')

Но перенаправление вызывает исключение, для которого я не нашел исправления:ValueError: dictionary update sequence element #0 has length 0; 2 is required

Я ищу не в том месте или есть способ заменить перенаправление на что-то другое?

# django-context
Источник
  • 0
    Я на 99% уверен, что проблема в аргументе имени в url или path
  • 0
    Вы, вероятно, передадите name в качестве позиционного аргумента в позиции context , используйте name='login' в имеющемся urlpattern, и он должен работать нормально.
  • 0
    вы имеете в виду заменить 'login' на 'name='login' ?
Codelisting
за -1 против
Лучший ответ

Вы не можете просто вернуть перенаправление из контекстного процессора, так как контекстные процессоры должны возвращать dict контекстных переменных.

Если вам действительно нужна эта функция в контекстном процессоре, вам нужно будет

  • определить собственный класс исключения (который, например, обертывает ответ)
  • вызвать такое исключение из обработчика контекста (так как вы не можете вернуть не словарь)
  • поймать настраиваемое исключение в промежуточном программном обеспечении Django, развернуть ответ и вернуть его

(в стороне, я написал пакет, который делает это -django-safespace )

Вместо этого, если можете, используйте login_required декоратор (или миксин CBV - см. связанную документацию), чтобы сделать все ваше представление зарегистрированным только пользователем.

за -1 против

РЕДАКТИРОВАТЬ: в приведенном выше ответе предполагалось что-то еще, поэтому я удалил и заменил объяснением, почему возврат перенаправления не работает, если вы хотите понять

context = {}
redirect = redirect('login')
context.update(redirect)

Это должно вызвать ту же ошибку, что и вы. Есть идея?

  • 0
    Я действительно не понимаю, где вы предлагаете мне это поставить и чем заменить ... на?
  • 0
    К сожалению, вы достигли 1% - эта проблема не имеет ничего общего с шаблонами URL.
  • 0
    См. Правку, которую я сделаю сейчас
  • 0
    Да, мб, я все равно объясню, что происходит
Codelisting
Популярные категории
На заметку программисту