我有这样的代码
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中重用。
有没有办法直接在我当前的代码中返回响应?看起来这是一个deadend ...除非我改变代码的编写方式(如何返回值...)
答案 0 :(得分:8)
您应该在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)
答案 1 :(得分:2)