实现API异常

在Flask之上实现RESTful API是非常常见的。开发人员首先遇到的第一件事是实现内置异常对于API不够表达,并且它们发出的内容类型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

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

注册错误处理程序

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

@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)