请求后Flask中Abort 404无效

2 投票
1 回答
4248 浏览
提问于 2025-04-19 04:02

我有一个使用Flask搭建的多域名网站,但我想限制所有视图和蓝图的访问,只有在某些域名下允许访问。所以我决定使用Flask的after request装饰器来实现这个功能,但问题是,在Flask的after request中,abort函数无法正常工作。这是怎么回事呢?

这是我的示例代码:

@app.after_request
def restricted_access(response):
    if g.site == 'store':
        return abort(404)
    return response

1 个回答

4

abort(404) 会引发一个异常,而不是像普通的函数那样返回一个响应对象。不过,因为 after_request 函数是在正常处理视图之后执行的,并且是在异常处理器之外,所以引发的 NotFound 异常不会被处理。

你可以重新使用通常应用于引发异常的视图的异常处理器:

from werkzeug.exceptions import NotFound

@app.after_request
def restricted_access(response):
    if g.site == 'store':
        return current_app.make_response(
            current_app.handle_user_exception(NotFound()))
    return response

handle_user_exception() 方法会返回一个 response 对象。

也就是说,如果你在 before_request() 处理器中已经知道了 g.site 的值,那么在那个时候返回一个 404 会简单得多;你可以安全地在 before_request() 处理器中使用 abort(404)

撰写回答