Django 上下文处理器在重定向时抛出错误

Django context processor throw error on redirect

我正在使用以下上下文处理器将上下文传递到我的所有页面,除非用户未登录,在这种情况下会将他带到登录页面:

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

我是不是找错了地方,或者有没有办法用其他东西替换重定向?

编辑:上面的答案假设了其他内容,所以我删除并替换为详细说明为什么返回重定向不起作用,以防您想了解

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

这应该会导致与您遇到的错误相同的错误。明白了吗?

您不能简单地 return 来自上下文处理器的重定向,因为上下文处理器需要 return 上下文变量的字典。

如果您确实需要上下文处理器中的此功能,则需要

  • 定义自定义异常class(例如包装响应)
  • 从上下文处理器中引发这样的异常(因为你不能 return 非字典)
  • 在 Django 中间件中捕获自定义异常,解开响应并return它

(顺便说一句,我写了一个包可以做到这一点 – django-safespace

相反,如果可以,请使用 login_required 装饰器(或 CBV mixin – 请参阅链接文档)使整个视图仅供登录用户使用。