请求后Flask中Abort 404无效
我有一个使用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)
。