将参数传递给Flask错误处理器

2 投票
1 回答
3489 浏览
提问于 2025-04-18 03:51

在我的网站上,我希望能给用户提供比“页面未找到”更好的404错误反馈。如果某个视图出现404错误,我想给模板传递一个额外的参数,描述这个视图显示的内容。例如:

views.py

def get_or_404(model, attribute, value, template, **kwargs):
    try:
        return session.query(model).filter(attribute == value).one()
    except NoResultFound:
        abort(404)

@app.errorhandler(404)
def page_not_found(error):
    return render_template("404.html"), 404

@app.route("project/<project_id>")
def project_show(project_id):
    """
    Show the files contained in a specific project.

    :param int project_id: The ID of the desired project.
    """

    project = get_or_404(Project, Project.id, project_id, "item_not_found.html", item="project")

    # Other stuff

如果用户尝试访问一个不存在的项目,他们就会被引导到一个404页面。如果我能把item这个参数(来自project_show)传递给模板404.html,那么模板就可以显示,比如“项目未找到”,而不仅仅是“页面未找到”。

那么,最好的做法是什么呢?

1 个回答

4

在Flask中,errorhandler路由已经有一个error参数。当你调用abort()时,Flask会抛出一个HTTPException,而errorhandler正是用来处理这个异常的。这里的主要意思是,你可以创建自己的异常类型,或者创建一个带有不同属性的异常,并在你的errorhandler模板中使用它。

第二个想法是使用闪现消息:在发生异常时,使用flash发送一条消息,然后调用abort(),接着在你的errorhandler模板中获取这条消息。

撰写回答