首页 > 解决方案 > 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

我没有找对地方,还是有办法用其他东西代替重定向?

标签: pythondjangodjango-context

解决方案


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

如果您真的需要在上下文处理器中使用此功能,则需要

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

(顺便说一句,我已经写了一个包来做到这一点 - django-safespace

相反,如果可以,请使用login_required装饰器(或 CBV 混合 - 请参阅链接文档)使您的整个视图仅以登录用户身份登录。


推荐阅读