python - 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 中间件中捕获自定义异常,解包响应并返回它
(顺便说一句,我已经写了一个包来做到这一点 - django-safespace
)
相反,如果可以,请使用login_required
装饰器(或 CBV 混合 - 请参阅链接文档)使您的整个视图仅以登录用户身份登录。
推荐阅读
- php - Laravel 分页渲染方法不存在
- xamarin - 安装 iOS 12.1.4 的 iPhone XS Max 上的应用程序崩溃
- javascript - 如何开玩笑地模拟函数或防止默认值?
- javascript - 如果调用了“event.stopPropagation()”,则“@Output”装饰器不会发出事件
- linux - 如何使用mingw在windows机器上编译linux可执行文件?
- vb.net - 为什么会出现“itextsharp.dll 中发生‘System.StackOverflowException’类型的未处理异常”以及如何解决
- caching - 如何配置 Drupal 以发送 Last Modified/Etag 标头
- tfs - 有没有办法让用户无需成为集合管理员就可以在 TFS-Azure DevOps 上创建自己的项目?
- vue.js - Vuetify 数据表手表不触发
- scala - Kafka Streams:配置“AdminClientConfig”或“ConsumerConfig”而不覆盖两者的值