2014-09-01 71 views
0

我有一个带有烧瓶的多域网站,但我想限制访问所有视图和蓝图,除了那些允许在某些域中访问它们的视图和蓝图。所以我决定在请求装饰器后使用烧瓶来做到这一点,但问题是中止在请求后没有在烧瓶中工作。问题是什么?中止404在请求后不能在烧瓶中工作

这是我的示例代码:

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

我认为你可以从外部检查'print g.site'是否产生正确的值? – Nava 2014-09-01 08:35:45

+0

@Navaneethan是的,我可以使用它,但我有一些很多的意见,我需要在所有的意见中使用的东西,如后来请求全球使用它。也可能是因为在开始视图功能处理之后也不好。 – 2014-09-01 08:55:36

+0

你在哪里更新'g.site' ?.您如何确定'g.site == store',只是尝试打印'g.site'和'response .__ dict__'函数的第一行,您会发现一些想法。 – Nava 2014-09-01 11:17:54

回答

2

abort(404)引发一个例外,它没有回报响应对象。但由于after_request函数在普通视图处理之后执行,并且在异常处理程序之外执行,因此将不会处理异常。

您可以重新使用通常应用于引发异常的看法异常处理程序:

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对象。这就是说,如果你已经知道g.sitebefore_request()处理程序中的值,那么返回一个404会更容易;您可以在before_request()处理程序中安全地使用abort(404)