Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

CRUD: Создание Python: Веб-разработка (Flask)

Процесс создания круда пользователя включает минимум семь маршрутов. Два из них — просмотр списка и конкретного ресурса — мы уже разобрали. В этом уроке разберем следующие два, которые относятся к созданию сущности.

Создание сущности

Создание сущности включает в себя два действия: отображение формы и обработка данных формы. За каждое из этих действий отвечает свой маршрут. Вот несколько примеров:

Пользователь

  • GET /users/new
  • POST /users

Курс

  • GET /courses/new
  • POST /courses

Сотрудник компании (пример вложенного маршрута)

  • GET /companies/3/users/new
  • POST /companies/3/users

image_processing.png

Разберем каждое действие подробнее.

Отображение формы

Обработчик

@app.route('/schools/new')
def new_school():
    school = []
    errors = []

    return render_template(
            'schools/new.html',
            school=school,
            errors=errors,
            )

Шаблон

<form action="/schools" method="post">
    <div>
        <label>
            Название *
            <input type="text" name="name" value="{{ school.name|default('', true) }}">
        </label>
        {% if errors %}
            <div>{{ errors.name }}</div>
        {% endif %}
    </div>
    <input type="submit" value="Create">
</form>

Содержимое обработчика сильно зависит от того, какой используется инструментарий. Если мы применяем билдеры формы, то обработчик создает форму как объект и отправляет его в шаблон. Билдер берет на себя огромное количество задач: обрабатывает вывод ошибок, занимается валидацией и подготовкой данных.

Особо умные билдеры знают про ту сущность, с которой они работают, и могут строить формы в полностью автоматическом режиме.

В нашем примере такого нет, поэтому все действия делаются руками. Кроме данных в шаблон передается список errors. Это нужно, так как форма используется обоими обработчиками: одним только для отображения новой формы, другим — для отображения формы в случае наличия ошибок.

Обработка данных формы

@app.post('/schools')
def post_school():
    repo = SchoolRepository()

    # Извлекаем данные формы
    data = request.form.to_dict()

    # Проверяем корректность данных
    errors = validate(data)
    if errors:
        # Если возникли ошибки, то устанавливаем код ответа в 422 и рендерим форму с указанием ошибок
        return render_template(
            'schools/new.html',
            school=data,
            errors=errors
            ), 422

    # Если данные корректны, то сохраняем, добавляем флеш и выполняем редирект
    repo.save(data)
    flash('School has been created', 'success')
    # Обратите внимание на использование именованного роутинга
    return redirect(url_for('schools'))

Своего шаблона у страниц с ошибкой при валидации нет. Если данные оказались не валидны, то этот обработчик рисует форму обработчика new и отправляет ее вместе с кодом ответа 422 — Unprocessable Entity. Если данные корректны, то выполняется основная логика обработчика – происходит сохранение школы в базу данных repo.save(data), а затем редирект на список школ с оповещением через флеш об успешном добавлении.

На этом создание сущности заканчивается. Следующим шагом научимся ее обновлять.


Самостоятельная работа

  1. Сделайте все поля формы создания пользователя обязательными
  2. Реализуйте обработку введенных данных и рендеринг формы с выводом ошибок

image_processing_2.png


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу