实现API异常

在Flask上实现RESTful API是很常见的。 开发人员遇到的第一件事就是认识到内置异常对API的表达不够,而且他们发出的内容类型:mimetype:`text / html`对API使用者来说并不是很有用。

比使用更好的解决方案 abort 为无效的API用法发出错误信号的方法是实现自己的异常类型,并为其安装一个错误处理程序,该处理程序以用户期望的格式生成错误。

简单异常类

基本思想是引入一个新的异常,该异常可以采用适当的人类可读的消息、错误的状态代码和一些可选的有效负载,从而为错误提供更多的上下文。

这是一个简单的例子:

from flask import jsonify

class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        return rv

视图现在可以用错误消息引发异常。此外,还可以通过' payload '参数将一些额外的有效负载作为字典提供。

注册错误处理程序

此时,视图可以引发该错误,但会立即导致内部服务器错误。原因是没有为此错误类注册处理程序。不过,这很容易补充:

@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

视图中的用法

以下是视图如何使用该功能:

@app.route('/foo')
def get_foo():
    raise InvalidUsage('This view is gone', status_code=410)