遍历路由无法找到特定于Url的404

时间:2015-06-15 17:04:21

标签: python pyramid

我们正在使用Pyramid框架,并拥有自定义404 Not Found处理程序:

@view_config(request_method='GET', renderer='webapp:templates/pages/404.html', context=HTTPNotFound)
@view_config(request_method='POST', renderer='webapp:templates/pages/404.html', context=HTTPNotFound)
def not_found(self):
    # Various (relatively) heavy-weight thinking occurs
    return {"some_data": some_data}

这适用于捕获任何未由遍历路由显式处理的POST或GET。但是,有一个url模式(api/*),有一个完全不同的处理程序是有用的,我们知道可以剥离到:

def not_found(self):
    return {"error_message": "This endpoint is not supported by the api."}

但是,我无法弄清楚如何将view_config设置为仅在context=HTTPNotFound的上下文中捕获api/。注意我们正在使用遍历路由,因此,我们在遍历路由树中有一个API对象。

1 个答案:

答案 0 :(得分:2)

According to documentation任何金字塔应用程序都可以根据需要定义多个未找到的视图。这意味着未找到的视图可以带有限制其适用性的谓词。

对于常见用例,金字塔开发人员添加了特殊的钩子。这些样本钩子(金字塔> = 1.3)会让你明白。

from pyramid.view import notfound_view_config

@notfound_view_config(request_method='GET')
def notfound_get(request):
    return Response('Not Found during GET, dude', status='404 Not Found')

@notfound_view_config(request_method='POST')
def notfound_post(request):
    return Response('Not Found during POST, dude', status='404 Not Found')

@notfound_view_config(context='.your_package.api_class') 
def notfound_post(request):
    """matches only when traversal returns an object of API class"""
    return Response('Not Found during POST request on API endpoint, dude', status='404 Not Found')

对于更高级的配置,我建议使用view configuration predicate arguments