Вернуть код состояния HTTP 201 в колбу

Мы используем Flask для одного из наших API, и мне просто интересно, знает ли кто-нибудь, как вернуть HTTP-ответ 201?

Для ошибок, таких как 404 мы можем позвонить:

from flask import abort
abort(404)

Но за 201 я получаю

LookupError: нет исключения для 201

Нужно ли мне создавать свое собственное исключение в документации?

12 ответов

Решение

Вы можете прочитать об этом здесь.

return render_template('page.html'), 201

Вы можете использовать Response для возврата любого http кода состояния.

> from flask import Response
> return Response("{'a':'b'}", status=201, mimetype='application/json')

Ты можешь сделать

from flask import make_response

result = {'a': 'b'}
return make_response(jsonify(result), 201)

если вы хотите вернуть данные JSON в ответе вместе с кодом ошибки, вы можете прочитать об ответах здесь и здесь, чтобы узнать подробности API make_response

Из-за недостатков рекомендуется отправить код состояния в операторе возврата, и если вы храните его в некоторой переменной, например

notfound = 404
invalid = 403
ok = 200

и используя

return xyz, notfound

чем время, убедитесь, что его тип int не str. как я столкнулся с этой небольшой проблемой, здесь приведен список кодов состояния, за которыми следуют во всем мире http://www.w3.org/Protocols/HTTP/HTRESP.html

Надеюсь, поможет.

В вашем коде колбы вы также должны в идеале указывать тип MIME как можно чаще:

return html_page_str, 200, {'ContentType': 'text / html'}

return json.dumps ({'success': True}), 200, {'ContentType': 'application / json'}

...так далее

Обрывая Luc , но чтобы вернуть пустой ответ, как здесь комментарий201 Самый простой вариант - использовать следующий возврат на вашем маршруте.

      return "", 201

Так например:

          @app.route('/database', methods=["PUT"])
    def database():
        update_database(request)
        return "", 201

Вы также можете использовать flask_api для отправки ответа

from flask_api import status

@app.route('/your-api/')
def empty_view(self):
    content = {'your content here'}
    return content, status.HTTP_201_CREATED

вы можете найти ссылку здесь http://www.flaskapi.org/api-guide/status-codes/

В моем случае мне пришлось объединить вышеперечисленное, чтобы заставить его работать

return Response(json.dumps({'Error': 'Error in payload'}), 
status=422, 
mimetype="application/json")

для ошибки 404 вы можете

      def post():
    #either pass or get error 
    post = Model.query.get_or_404()
    return jsonify(post.to_json())

за 201 успех

      def new_post():
    post = Model.from_json(request.json)
    return jsonify(post.to_json()), 201, \
      {'Location': url_for('api.get_post', id=post.id, _external=True)}

Вам просто нужно добавить свой код состояния после возвращаемых данных следующим образом:

      from flask import Flask

app = Flask(__name__)
@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!',201
if __name__ == '__main__':
    app.run()

Это базовый проект фляги. После запуска, и вы обнаружите, что когда мы запрашиваем http://127.0.0.1:5000/вы получите статус 201 из консоли веб-браузера.

В зависимости от того, как создается API, обычно с 201 (созданным) вы возвращаете ресурс, который был создан. Например, если бы он создавал учетную запись пользователя, вы бы сделали что-то вроде:

return {"data": {"username": "test","id":"fdsf345"}}, 201

Обратите внимание, что номер с постфиксом - это возвращаемый код состояния.

В качестве альтернативы вы можете отправить клиенту сообщение, например:

return {"msg": "Created Successfully"}, 201

Итак, если вы используете flask_restful Пакет для возврата 201 API будет выглядеть как

def bla(*args, **kwargs):
    ...
    return data, 201

где data должно быть любое значение hashable/ JsonSerialiable, например dict, string.

Другие вопросы по тегам