Короткий ответ
В декораторе @app.route указывается список допустимых методов через параметр methods, а внутри функции-обработчика ветвление делается по request.method.
Как это работает подробнее
Flask по умолчанию регистрирует маршрут только на GET (и HEAD/OPTIONS автоматически). Чтобы разрешить другие методы, их явно перечисляют в methods=[...]. Внутри обработчика доступен текущий метод через request.method.
Пример кода
example.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/items", methods=["GET", "POST"])
def items():
if request.method == "POST":
data = request.get_json()
return jsonify({"created": data}), 201
return jsonify({"items": []})
# curl -X POST -H "Content-Type: application/json" -d '{"name":"a"}' /items
# -> 201 {"created": {"name": "a"}}Что использовать на практике
- Практика. Для простых случаев один обработчик с условием на
request.methodчитается нормально; если логика веток сильно различается и растёт, лучше разделить на отдельные функции или использоватьMethodView.
Подводные камни
- Риск. Забывают добавить POST в
methods, из-за чего Flask возвращает405 Method Not Allowed; путаютrequest.form(данные формы) иrequest.get_json()(JSON-тело).