2013-09-13 4 views
3

У меня есть код, как этотВозвращение ответа в термосе

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 является извлечение из общего кода, а затем повторно использовать в нескольких других подобных APIs.

Есть ли способ вернуть ответ прямо в моем текущем коде? Кажется, что это ненормально ... если я не изменил способ написания кода (как значения возвращаются ...)

ответ

6

Вы должны поднять исключение в 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) 
+0

Это отличный совет. Я всегда хотел ввести какое-то исключение. Это кажется хорошей идеей. Я боялся создавать слишком много обычаев для каждой ошибки, но да, я должен посмотреть на создание более общего. Изучит их. благодаря – User007

1

По this ответ, вы можете также просто

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

вернуться код состояния 400.

Смежные вопросы