4

我正在使用 webapp2 在 App Engine 中进行开发。我想做的是在发生错误时发送自定义 JSON 格式的响应。例如,当请求长度大于阈值时,使用 HTTP 400 和响应正文进行响应

{'error':'InvalidMessageLength'}

在 webapp2 中,可以选择为某些异常分配错误处理程序。例如:

app.error_handlers[400] = handle_error_400

其中 handle_error_400 如下:

def handle_error_400(request, response, exception):
    response.write(exception)
    response.set_status(400)

webapp2.RequestHandler.abort(400)被执行时,上面的代码就被执行了。

如何根据上述设置动态地拥有不同的响应格式(HTML 和 JSON)?也就是说,如何调用不同版本的handle_error_400函数?

4

1 回答 1

5

这是一个完整的示例,它演示了如何为所有类型的错误使用相同的错误处理程序,如果您的 URL 以开头,/json那么响应将是一个application/json(发挥您的想象力,了解如何充分利用该request对象来决定什么你应该提供什么样的回应):

import webapp2
import json

def handle_error(request, response, exception):
  if request.path.startswith('/json'):
    response.headers.add_header('Content-Type', 'application/json')
    result = {
        'status': 'error',
        'status_code': exception.code,
        'error_message': exception.explanation,
      }
    response.write(json.dumps(result))
  else:
    response.write(exception)
  response.set_status(exception.code)

app = webapp2.WSGIApplication()
app.error_handlers[404] = handle_error
app.error_handlers[400] = handle_error

在上面的示例中,您可以通过访问以下将返回 a 的 URL 轻松测试不同的行为,404这是最容易测试的错误:

http://localhost:8080/404
http://localhost:8080/json/404
于 2013-03-26T23:34:18.797 回答