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

151

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

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

from flask import abort
abort(404)

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

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

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

ingh.am
источник
19
return '', 201
Люк

Ответы:

161

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

return render_template('page.html'), 201
Якс
источник
13
Для этого требуется page.html... Само по себе это не сработает.
Крис Стричински
Для меня этот тип обработки ошибок работал (за IIS) только в том случае, если InvalidUsage был дочерним элементом werkzeug.exceptions.HTTPException, а не общим исключением
Дьюла Самуэль Карли
137

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

> from flask import Response
> return Response("{'a':'b'}", status=201, mimetype='application/json')
Ясир
источник
4
Это должен быть принятый ответ, это лучший способ сделать это.
LoopsGod
Это действительно идеальное решение
Шахриар Рахман Захин
отлично, никогда не думай раньше
Ариан Сапутра
26

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

notfound = 404
invalid = 403
ok = 200

и используя

return xyz, notfound

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

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

Суровый Дафтари
источник
19

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

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

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

Кишан К
источник
6

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

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

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

...так далее

Бен Уиллер
источник
2

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

Вивек
источник
1

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

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

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

Дипак Шарма
источник
1

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

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

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

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

return {"msg": "Created Successfully"}, 201
Croc
источник
0

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

return Response(json.dumps({'Error': 'Error in payload'}), 
status=422, 
mimetype="application/json")
Cheetara
источник