Django自定义重定向装饰器调用后视图返回None报错如何解决
问题根因
两个自定义装饰器的正常执行分支都没有返回原视图函数的执行结果,Django要求所有视图必须返回HttpResponse对象,没有return的场景下函数默认返回None,就触发了你看到的报错。此外你第二个装饰器里直接调用未定义的context变量也会引发额外报错,需要同步修正。
修正后的代码
装饰器1(debugging)
def debugging(func): def inner(request, *args, **kwargs): print("DEBUGGING") if not settings.DEBUG or not request.user.is_superuser: return render(request, 'myapp/manutenzione.html') # 必须return原视图的执行结果 return func(request, *args, **kwargs) return inner
装饰器2(重定向逻辑)
def reindirizzamenti_necessari(func): def inner(request, *args, **kwargs): print("REINDIRIZZAMENTI") sito = get_current_site(request) dominio = sito.domain if dominio.startswith("www."): dominio = dominio.split("www.", 1)[1] try: dominio_obj = Dominio.objects.get(dominio = dominio) sito_generale = False # 重定向到主域名 if not dominio_obj.principale: url = '/redirect/' + dominio_obj.città.nome.lower() return redirect(url) # 不要直接操作原视图的context,把值放到request对象里传递 request.luogo = dominio_obj.città # 主域名场景返回原视图执行结果 return func(request, *args, **kwargs) # 不要用裸except,明确捕获域名不存在的异常,避免吞掉其他报错 except Dominio.DoesNotExist: print("DOMINIO GENERALE") if dominio.endswith(".it"): return redirect("https://www.mymaindomainname.com") # 通用域名场景返回原视图执行结果 return func(request, *args, **kwargs) return inner
被装饰的视图(适配参数传递)
@debugging @reindirizzamenti_necessari def homepage(request): context = { # 从request中取装饰器注入的站点信息 'luogo': getattr(request, 'luogo', None) } return render(request, 'myapp/index.html', context)
内容的提问来源于stack exchange,提问作者H3x
相关产品推荐
相关产品推荐

