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 – 请参阅链接文档)使整个视图仅供登录用户使用。
我正在使用以下上下文处理器将上下文传递到我的所有页面,除非用户未登录,在这种情况下会将他带到登录页面:
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 – 请参阅链接文档)使整个视图仅供登录用户使用。