在Flask中返回响应

4
我有这样的代码
def find_user(user_id):
    if not users.lookup(user_id):
        return jsonify(success=False, reason="not found")
    else:
        return users.lookup(user_id)

@app.route(...)
def view1(...):
    user = find_user(...)
    if user:
       do_something
    return jsonify(success=True, ....)

问题在于我有一个帮助函数,如果满足condition,我想立即返回响应。在这种情况下,如果用户未找到,我想返回一个请求,说明请求失败并给出原因。

问题是,由于该函数还可以返回一些其他值(比如用户对象),我不能从请求中返回。相反,因为我们得到了一个分配,我们将继续执行其余的代码路径。

我可能可以进行类型检查,但那很丑陋!

理想情况下,这是更长的代码

def view(...)
    user = users.lookup(user_id)
    if not user:
       return jsonify(success=False....)
    # if user is true, do something else

辅助函数find_user的主要作用是提取公共代码,然后在几个类似的API中重复使用。

是否有一种方法可以直接在当前代码中返回响应?看起来这是一个死路......除非我改变代码的编写方式(如何返回值...)

2个回答

11

您应该在find_user中引发异常,然后添加一个处理程序来返回该异常的正确响应。以下是来自http://flask.pocoo.org/docs/patterns/apierrors/的示例:

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(InvalidAPIUsage)
def handle_invalid_usage(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

使用这个例子,在您的find_user函数中,您可以这样做:

raise InvalidUsage('User not found', status_code=404)

3

根据这个答案,您也可以简单地执行以下操作:

return jsonify(success=False....), 400

返回状态码400。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接