🔖 Справочник: request, статус-коды, SQLAlchemy 2.x

⚡ Быстрый справочник

# Получить JSON из запроса
data = request.get_json()

# Получить по ID (SQLAlchemy 2.x)
obj = db.session.get(Model, id)

# Список (SQLAlchemy 2.x)
from sqlalchemy import select
items = db.session.execute(select(Model)).scalars().all()

# Сохранить
db.session.add(obj); db.session.commit()

# Удалить
db.session.delete(obj); db.session.commit()

# Статусы: 200 OK, 201 Created, 400 Bad Request, 404 Not Found

1. Объект request — шпаргалка

Атрибут/методТип данныхКогда использовать
request.args ImmutableMultiDict Query-параметры URL: /items?limit=10
request.args.get('key', default) str | None Безопасное получение параметра
request.form ImmutableMultiDict HTML-форма (enctype не multipart)
request.get_json() dict | None JSON тело; возвращает None при ошибке
request.get_json(force=True) dict | None JSON без проверки Content-Type
request.json dict То же, но бросает 400 при плохом JSON
request.data bytes Сырые байты
request.method str Строка метода: 'GET', 'POST', 'PUT'…
request.headers Headers HTTP-заголовки
request.headers.get('Authorization') str | None Auth-заголовок
request.files ImmutableMultiDict[FileStorage] Загрузка файлов (multipart/form-data)
request.files.get('photo') FileStorage | None Получить конкретный файл

2. HTTP статус-коды в Flask

КодСмыслКогда возвращать
200OKУспешный GET, PUT, DELETE
201CreatedУспешный POST — ресурс создан
204No ContentУспешно, но ответ пустой (например, DELETE)
400Bad RequestНекорректный запрос, нет обязательных полей
401UnauthorizedНе аутентифицирован
403ForbiddenНет прав
404Not FoundРесурс не найден
409ConflictКонфликт (например, дубликат)
422Unprocessable EntityОшибка валидации (Pydantic)
500Internal Server ErrorНеобработанное исключение

Паттерны задания статусов во Flask

# 1. Кортеж
return jsonify(data), 200

# 2. make_response
from flask import make_response
resp = make_response(jsonify(data), 201)
resp.headers['Location'] = f'/questions/{obj.id}'
return resp

# 3. abort() — стандартная ошибка
from flask import abort
abort(404)        # прерывает обработку, возвращает 404

# 4. Кастомный обработчик ошибок
@app.errorhandler(404)
def not_found(e):
    return jsonify({'error': 'Not found'}), 404

3. SQLAlchemy 2.x — CRUD в Flask

from sqlalchemy import select

# CREATE
obj = Model(field=value)
db.session.add(obj)
db.session.commit()
print(obj.id)   # ID присвоен после commit

# READ — один по ID
obj = db.session.get(Model, id)   # None если не найден

# READ — список
objs = db.session.execute(select(Model)).scalars().all()

# READ — с фильтром
result = db.session.execute(
    select(Model).where(Model.field == value)
).scalars().all()

# READ — первый или None
one = db.session.execute(
    select(Model).filter_by(field=value)
).scalar_one_or_none()

# UPDATE
obj = db.session.get(Model, id)
obj.field = new_value
db.session.commit()

# DELETE
obj = db.session.get(Model, id)
db.session.delete(obj)
db.session.commit()

4. Шаблон эндпоинта с обработкой ошибок

@bp.route('/<int:id>', methods=['PUT'])
def update_item(id):
    # 1. Найти объект
    item = db.session.get(Item, id)
    if item is None:
        return jsonify({'error': 'Not found'}), 404

    # 2. Получить и проверить данные
    data = request.get_json()
    if not data:
        return jsonify({'error': 'No data provided'}), 400

    # 3. Применить изменения
    if 'name' in data:
        item.name = data['name']

    # 4. Сохранить
    db.session.commit()
    return jsonify({'message': 'Updated', 'id': item.id}), 200
← К оглавлению урока