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

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

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

from flask import abort
abort(404)

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

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

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


person ingh.am    schedule 19.10.2011    source источник
comment
Это, поскольку 201 не является ошибкой. Это статус успеха.   -  person Michael Murphy    schedule 09.06.2021


Ответы (11)


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

return render_template('page.html'), 201
person Iacks    schedule 19.10.2011
comment
Для этого требуется _1 _... Само по себе это не сработает. - person Chris Stryczynski; 15.11.2018
comment
Для меня этот тип обработки ошибок работал (за IIS), только если InvalidUsage был дочерним элементом werkzeug.exceptions.HTTPException, а не общим исключением - person Gyula Sámuel Karli; 15.06.2020

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

> from flask import Response
> return Response("{'a':'b'}", status=201, mimetype='application/json')
person Yasir    schedule 13.09.2017
comment
Это должен быть принятый ответ, это лучший способ сделать это. - person LoopsGod; 23.02.2020

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

notfound = 404
invalid = 403
ok = 200

и используя

return xyz, notfound

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

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

person Harsh Daftary    schedule 18.07.2014
comment
Хороший способ, но лучше обращаться к ним как к модулю, например status.NOT_FOUND - person roshnet; 27.05.2021

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

result = {'a': 'b'}
return result, 201

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

person Kishan K    schedule 25.01.2019
comment
Вам даже не нужен jsonify - person pihentagy; 22.03.2021
comment
Клиентская сторона django ?? Речь идет о фляжке! - person pihentagy; 11.05.2021
comment
упс @pihentagy извините за путаницу. Обновленное решение - person Kishan K; 18.05.2021

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

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

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

...и т.д

person Ben Wheeler    schedule 11.09.2017

вы также можете использовать 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/

person Vivek    schedule 12.10.2019

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

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

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

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

return {"msg": "Created Successfully"}, 201
person Croc    schedule 04.12.2019

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

return "", 201

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

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

для ошибки 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)}
person Josie Koay    schedule 19.04.2021

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

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

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

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

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

person Deepak Sharma    schedule 04.12.2019