当没有路由匹配时覆盖 Falcon 的默认错误处理程序
Override Falcon's default error handler when no route matches
当Falcon(-Framework) 找不到特定请求的路由时,返回404。如何覆盖此默认处理程序?我想用自定义响应扩展处理程序。
没有资源匹配时的默认处理程序是 path_not_found 响应者:
但是正如您在 falcon API 的 _get_responder 方法中看到的那样,如果不进行一些猴子修补,就无法覆盖它。
据我所知,有两种不同的方式来使用自定义处理程序:
- Subclass API class,并覆盖 _get_responder 方法,以便它调用您的自定义处理程序
- 如果 none 个应用程序匹配,则使用匹配任何路由的默认路由。您可能更喜欢使用 sink 而不是路由,因此您可以捕获具有相同功能的任何 HTTP 方法(GET、POST...)。
我会推荐第二个选项,因为它看起来更整洁。
您的代码如下所示:
import falcon
class HomeResource:
def on_get(self, req, resp):
resp.body = 'Hello world'
def handle_404(req, resp):
resp.status = falcon.HTTP_404
resp.body = 'Not found'
application = falcon.API()
application.add_route('/', HomeResource())
# any other route should be placed before the handle_404 one
application.add_sink(handle_404, '')
这里有更好的解决方案。
def custom_response_handler(req, resp, ex, params):
resp.status = falcon.HTTP_404
resp.text = "custom text response"
app = falcon.App()
app.add_error_handler(HTTPRouteNotFound, custom_response_handler)
当Falcon(-Framework) 找不到特定请求的路由时,返回404。如何覆盖此默认处理程序?我想用自定义响应扩展处理程序。
没有资源匹配时的默认处理程序是 path_not_found 响应者:
但是正如您在 falcon API 的 _get_responder 方法中看到的那样,如果不进行一些猴子修补,就无法覆盖它。
据我所知,有两种不同的方式来使用自定义处理程序:
- Subclass API class,并覆盖 _get_responder 方法,以便它调用您的自定义处理程序
- 如果 none 个应用程序匹配,则使用匹配任何路由的默认路由。您可能更喜欢使用 sink 而不是路由,因此您可以捕获具有相同功能的任何 HTTP 方法(GET、POST...)。
我会推荐第二个选项,因为它看起来更整洁。
您的代码如下所示:
import falcon
class HomeResource:
def on_get(self, req, resp):
resp.body = 'Hello world'
def handle_404(req, resp):
resp.status = falcon.HTTP_404
resp.body = 'Not found'
application = falcon.API()
application.add_route('/', HomeResource())
# any other route should be placed before the handle_404 one
application.add_sink(handle_404, '')
这里有更好的解决方案。
def custom_response_handler(req, resp, ex, params):
resp.status = falcon.HTTP_404
resp.text = "custom text response"
app = falcon.App()
app.add_error_handler(HTTPRouteNotFound, custom_response_handler)