【问题标题】:Django context processor throw error on redirectDjango 上下文处理器在重定向时抛出错误
【发布时间】:2021-06-03 13:28:37
【问题描述】:

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

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

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

【问题讨论】:

  • 我 99% 确定问题出在 urlpath 中的名称参数中
  • 您可能会将name 作为位置参数传递到context 的位置,在您拥有的urlpattern 中使用name='login',它应该可以正常工作。
  • 你的意思是用'name='login'替换'login'

标签: python django django-context


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你能举个例子吗@AKX
  • 或者您能否写一下,当我尝试提交表单时,如何在上下文处理器中呈现表单?或者在刷新时,它一次又一次地提交。我可以从上下文处理器呈现消息吗?
  • @ash 如果需要,您可以从上下文处理器返回表单对象。我不会使用上下文处理器来处理请求消息,这听起来很麻烦。
  • 我正在创建一个页脚订阅表单
  • 对。您可以使用模板标记或上下文处理器来呈现一个,但这里的 cmets 不是提问的正确位置。问一个详细说明您的特定问题的问题。
【解决方案2】:

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

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

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

【讨论】:

  • 我真的不明白你建议我把它放在哪里,我应该用什么替换 ...
  • 不幸的是你达到了 1% - 这个问题与 URL 模式无关。
  • 是的,我会解释到底发生了什么
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多