You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail页面模型get_context方法异常处理:重定向错误页问题求助

解决Wagtail页面get_context重定向报错问题

错误原因

Wagtail的get_context方法仅负责返回模板渲染所需的上下文字典,不允许返回HttpResponse(包括重定向响应),直接在该方法内尝试重定向会触发"get_context must return a dict"错误。

正确实现方式

要实现出错时重定向,应该在页面的serve方法中处理——这是Wagtail页面处理请求的核心入口,允许返回任意HttpResponse类型。

代码示例

假设你的页面模型原本写法如下(会报错的版本):

from wagtail.models import Page

class MyCustomPage(Page):
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        try:
            # 模拟可能抛出错误的数据获取逻辑
            context['data'] = some_risky_data_fetching_method()
        except Exception as e:
            # 此处尝试重定向会触发错误
            return redirect('/error-page/')
        return context

修改为在serve方法中处理错误:

from django.shortcuts import redirect
from wagtail.models import Page

class MyCustomPage(Page):
    def serve(self, request, *args, **kwargs):
        try:
            # 提前执行可能出错的数据获取逻辑
            self.risky_data = some_risky_data_fetching_method()
        except Exception as e:
            # 出错直接返回重定向响应
            return redirect('/error-page/')
        
        # 正常流程下调用父类serve方法,继续上下文处理
        return super().serve(request, *args, **kwargs)
    
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        # 直接使用已获取好的数据
        context['data'] = self.risky_data
        return context

简化实现(适合简单场景)

如果不想维护实例变量,也可以直接在serve中完成数据获取与重定向逻辑,再传递数据到上下文:

def serve(self, request, *args, **kwargs):
    try:
        data = some_risky_data_fetching_method()
    except Exception:
        return redirect('/error-page/')
    
    context = self.get_context(request, *args, **kwargs)
    context['data'] = data
    return self.render(request, context)

注意事项

  • 避免硬编码错误页URL,可通过Wagtail页面实例的url属性生成地址(比如ErrorPage.objects.first().url),提升可维护性。
  • 建议针对具体异常类型捕获处理,而非捕获所有Exception,防止掩盖其他未知问题。

内容的提问来源于stack exchange,提问作者DavidU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:35:55