📝 Задания

⚡ Задания быстро

  1. Что возвращает request.get_json() при отсутствии JSON в теле?
  2. Какой статус-код у create_question при успехе?
  3. Переписать Question.query.get(id) на SQLAlchemy 2.x.
  4. Что происходит если забыть db.session.commit() после db.session.add()?
  5. Написать эндпоинт PATCH для частичного обновления.

Задание 1. Объект request — выбрать правильный атрибут

Для каждого сценария выберите правильный атрибут / метод объекта request:

  1. Клиент отправил GET запрос /items?category=books&page=2. Как получить значение category?
  2. Клиент отправил POST с телом {"name": "Flask"} и заголовком Content-Type: application/json. Как получить данные?
  3. HTML-форма отправила поле username через POST (enctype=application/x-www-form-urlencoded). Как получить значение?
  4. Вы хотите проверить, что запрос использует метод DELETE. Как это сделать?
  5. Нужно получить заголовок Authorization. Как?

Задание 2. HTTP статус-коды

Определите правильный статус-код для каждой ситуации:

  1. Клиент успешно создал новый вопрос через POST.
  2. Клиент запросил вопрос с ID=999, которого нет в базе.
  3. Клиент отправил POST без поля text.
  4. Сервер успешно вернул список всех вопросов.
  5. Сервер успешно удалил вопрос и не возвращает тело ответа.
  6. Клиент не предоставил токен аутентификации.

Задание 3. Переписать на SQLAlchemy 2.x

Переписать каждый фрагмент с Legacy API на современный:

# Фрагмент A
questions = Question.query.all()

# Фрагмент B
question = Question.query.get(id)

# Фрагмент C
stat = Statistic.query.filter_by(question_id=q_id).first()

# Фрагмент D
active = Item.query.filter(Item.active == True).order_by(Item.name).all()

Задание 4. Найти ошибку

В следующем коде есть несколько ошибок. Найдите их и исправьте:

@questions_bp.route('/<int:id>', methods=['PUT'])
def update_question(id):
    question = Question.query.get(id)
    data = request.get_json()
    question.text = data['text']   # строка A
    return jsonify({'message': 'ok'}), 200  # строка B

Задание 5. Написать эндпоинт

Напишите эндпоинт PATCH /questions/<id>, который обновляет только переданные поля (частичное обновление). Если передан text — обновить текст. Возврат: 200 с обновлённым объектом, 404 если не найден, 400 если тело пустое.

Задание 6. Логика add_response

Ответьте на вопросы по функции add_response:

  1. Почему важно вызвать db.session.commit() только один раз в конце, а не после каждого db.session.add()?
  2. Что произойдёт если отправить {"question_id": 1, "is_agree": true} дважды? Какой будет agree_count?
  3. Для вопроса с ID=1 ещё нет записи в Statistic. Пользователь отправляет is_agree=false. Какими будут значения после сохранения?

→ Посмотреть решения

← К оглавлению урока