Wagtail 页面如何在 get_context 出错时跳转到错误页?
数据阿明
结论
get_context() 应返回字典,不能返回重定向响应。数据获取失败时,可以在页面模型的 serve() 方法中捕获异常,并返回 Django 重定向响应。serve() 返回 HTTP 响应,适合处理跳转。
出现 get_context must return a dict,通常是因为异常处理代码在 get_context() 中返回了 redirect(...) 或其他非字典值。
示例
假设错误页配置了 Django URL 名称 error_page:
import logging
from django.shortcuts import redirect
from wagtail.models import Page
logger = logging.getLogger(__name__)
class DataPage(Page):
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
context["items"] = self.fetch_items()
return context
def serve(self, request, *args, **kwargs):
try:
return super().serve(request, *args, **kwargs)
except Exception:
logger.exception("Failed to build or serve DataPage")
return redirect("error_page")
super().serve() 会继续执行页面的常规处理。如果调用 get_context() 时发生异常,这里会捕获异常,并返回指向 error_page 的重定向响应。请将 error_page 换成项目中实际配置的 URL 名称。
注意事项
get_context()正常执行时,应返回包含页面模板所需数据的字典,例如context。- 示例捕获所有
Exception,页面处理期间发生的多种错误都会被导向错误页。实际项目中,最好只捕获数据获取过程中预期会出现的异常,以免掩盖编程错误。 logger.exception()会记录异常堆栈,方便排查问题。请确保错误页不会再次进入同一段失败逻辑,以免造成重定向循环。- 如果错误页是 Wagtail 页面,请确保它有可访问的 URL,并根据项目路由配置进行跳转。
备注:内容仅供参考。
