Вернуть код состояния 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')
Из-за недостатков рекомендуется отправить код состояния в операторе возврата, и если вы храните его в некоторой переменной, например
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.