Рубрики
Без рубрики

Как использовать Python и Flask, чтобы построить веб-приложение – углубленный учебник

Автор оригинала: Abhinav Suri.

Python – это невероятно универсальный язык. Считается, что это основной продукт современного развития. Он используется для простейших скриптов к сложным алгоритмам обучения машин и нервной сети.

Но, возможно, менее известное использование Python – это его использование в качестве веб-сервера. Омрачивается более популярными каркасами, такими как узел/экспресс и Ruby на рельсах, Python часто пропускается в качестве выбора веб-сервера для большинства разработчиков.

Наличие бэкэнда, написанного в Python, действительно полезно по нескольким причинам, среди которых:

  • Легко подняться от изучения Python в качестве регулярного языка сценариев для использования его, чтобы сделать бэкэнд.
  • Лучше всего использовать, если вы планируете обслуживать части вашего приложения, которые уже написаны в Python (например, – отправка формы, оценка входа через модель Tensorflow и возвращение вывода на использование)
  • Он имеет разнообразную экосистему пакетов и инструментов, которые помогут вам с развитием, не говоря уже о отличном сообществе разработчиков (поскольку язык вокруг себя так долго)

Целью данной статьи является продемонстрировать, как Python может использоваться для создания полного приложения стека. В этом руководстве я буду использовать колбу, питон «Микроразрушение» для разработки веб-приложения.

Я бы не упомянул, что существуют другие более популярные рамки Python, такие как Django, но колба полезна для подающего застройщика, поскольку оно голые кости и требует разработчиков для создания/использования компонентов, которые им нужны в приложении на основе приложения на основе Их требование (вместо того, чтобы звонить в какой-то инструмент командной строки, который автоматически генерирует 20 файлов … смотрите на вас Ruby на рельсах). Конечно, я не буду проходить, как начать веб-приложение полностью с нуля, скорее я дам вам вступление в колбу, а затем переместите на то, как вы можете использовать проект под названием Flask-Base, чтобы быстро получить скорость будущее.

Вступление в колбу

Flask – это микроразмерная работа (читайте как: оно не так много) для веб-разработки в Python. Прежде чем мы сделаем глубокую (Иш) погружение, давайте охватим некоторые основные концепции развития бэкэнда.

Маршруты

Давайте представим, что вы посещаете apple.com И хочу перейти в раздел Mac в apple.com/mac/ Отказ Как знают серверы Apple, чтобы обслуживать вам конкретную страницу, которая показывает детали о Mac Machents. Скорее всего, поскольку у них есть веб-приложение на сервере, который знает, когда кто-то смотрит вверх apple.com и идет к /Mac/ Раздел сайта, обратитесь к этому запросу и отправьте несколько страниц. Логика по поводу выяснения, что делать, когда кто-то идет /Mac/ делается Маршрут Отказ

Так когда я посещаю apple.com (подразумевается Apple.com/ ), / Маршрут обрабатывает то, что показано. Если я пойду в Apple.com/purchase , есть /Покупка маршрут. Если я пойду в Apple.com/purchase/1 где 1 Это какой-то идентификатор элемента, там, скорее всего, является универсальным обработчиком маршрута /Покупка/ ID> Это обрабатывает этот запрос. Пункт маршрутов также могут обрабатывать как запрашивать.

Базовое приложение

Итак, как мы создаем приложение Basic Flask, которое имеет маршруты? Ну, давайте посмотрим на документы. Создайте файл Python под названием Hello.py который содержит следующее.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
	return "Hello World"

Давайте сломаемся здесь, что происходит здесь.

  1. Мы импортируем нашу зависимость колбу
  2. Мы создаем экземпляр приложения Flask. Аргумент, переданный в концертный инстантор ( __name__ ), оценивает строку, которая «имена» приложение Flask. При запуске из командной строки __name__ Отказ Вы можете установить первый аргумент на все, что вы хотите.
  3. Мы создали маршрут / в нашем приложении, которое выполняет Здравствуйте ( ) Функция непосредственно под ним, когда этот маршрут посещается. Обратите внимание, что функция должна вернуть строку или представленный шаблон.

В командной строке давайте настроим что-то, называемое виртуальной средой (она поможет нам изолировать нашу среду разработки и установки упаковки от остальной части нашей системы).

  1. Если вы еще этого не сделали, установите PIP через easy_install pip (Вам может потребоваться запустить Sudo перед этим, если вы находитесь на Mac.
  2. Беги PIP Установить Virtualenv Чтобы установить VirtualenV с помощью PIP
  3. В каталоге вашего приложения создайте свою виртуальную среду, запустив Virtualenv Venv (Это создает виртуальную среду в папке под названием VINV текущего каталога).
  4. Беги Источник Venv/Bin/Activate активировать виртуальную среду. Это специально необходимо для установки пакетов в него. Вы можете деактивировать виртуальную среду, запустив Деактивировать из командной строки. Довольно просто.

Теперь, когда наша виртуальная среда установлена и активирована, давайте установим колбу. Это действительно просто, просто беги PIP Установить колбу Отказ Затем мы можем запустить пример более раннего, написав следующие в нашей командной строке.

FLASK_APP=hello.py flask run

Вы должны увидеть что-то вроде * Работает на http://localhost: 5000/ в вашем терминале. И если вы посетите эту ссылку в своем браузере, вы увидите страницу с просто Здравствуйте, мир Отказ

Пример приложения: обзор Club Penn

Примечание. Код для этого проекта можно найти в Этот репозиторий на Github .

Теперь давайте посмотрим какой-то проект для создания, чтобы продемонстрировать полные возможности колбы. Один недавний проект, который я придумал, это приложение Club Rating под названием «PennclubReview».

Я сейчас посещаю Университет Пенсильвании. Одной из наиболее распространенных проблем, которые первокурсники на кампусе лицо выбирают, какие клубы присоединяются к кампусу. Этот процесс дополнительно осложняется тем, что некоторые клубы очень конкурентоспособны, имеют несколько раундов интервью и требуют больших обязательств. Часто ни один из этих аспектов клубов не обсуждается во время сеансов клубных информационных сессий.

Итак, чтобы бороться с этой проблемой мы можем создать приложение, где

  • Администратор может устанавливать вопросы опроса для пользователей, чтобы ответить на клубы.
  • Пользователи могут просматривать средние рейтинги для каждого опроса для каждого клуба
  • Пользователи могут просматривать отдельные ответы для клубов. Если пользователь выбирает подать еще один обзор, их предыдущий ответ перезаписан.
  • Пользователи могут предложить клубы для администраторов для редактирования/одобрения, чтобы показать на публике (администраторы должны быть уведомлены по электронной почте, когда это произойдет)
  • Пользователь или админ должны быть в состоянии редактировать свою учетную запись информации.
  • Администратор должен иметь возможность добавлять/удалять пользователей, опрос вопросов, клубных категорий и клубов из системы.

Раскрытие компонентов приложений

Чтобы разработать это приложение, нам нужно иметь еще несколько компонентов в дополнение к колбе, например, в базе данных поддерживающей базы данных, система управления входом в систему, какой-то способ организовать маршруты и обрабатывать по электронной почте. Мы мог бы код этого с нуля. Но уже есть удивительная ботинка, которая может дать вам отличное начальное место.

Введите флакон-базу

Flask-Base – это проект, который мои друзья и я разработали как часть студенческого бега, некоммерчески называемых Hack4Impact Отказ Мы работаем с некоммерческими отдельными семестром, чтобы разработать технические проекты, которые помогают им выполнить свою миссию.

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

  • Схема аутентификации пользователя
  • Управление аккаунтом
  • Чертежи (чтобы обрабатывать маршруты)
  • Поддержка базы данных
  • По электронной почте (с очередью Redis)

Недавно он стал довольно популярным, набирая 1200+ звезд GitHub в течение нескольких месяцев. Эта кодовая база идеально подходит для того, что мы пытаемся настроить. Вы можете найти REPO GitHub, содержащий код для базы Flask здесь Отказ

Настройка разработки приложения

Сначала давайте клонировать колбу-основание. Следуйте инструкциям на странице readme.md. В двух словах запускайте следующее.

git clone https://github.com/hack4impact/flask-base.git

cd flask-base

virtualenv  venv

source venv/bin/activate

pip install -r requirements.txt

python manage.py recreate_db

python manage.py setup_dev

ОК. Я разработаю то, что мы здесь сделали.

  • Клонировать репозиторий из GitHub (то есть скачать его), а затем перейдите в свой каталог.
  • Создайте новую виртуальную среду и активируйте ее.
  • Прочитайте пакетные зависимости в требования .txt Файл и установить все из них через Пип Отказ
  • Сведения о базе данных (воссоздайте его), а также вставьте правило администратора (через setup_dev).

Кроме того, давайте создадим миграцию базы данных. Это будет отслеживать изменения в наших моделях базы данных, не требуя воссоздания нашей базы данных (I.e. Удалить всю информацию, а затем восстановить базу данных с нуля). Миграции позволяют нам сохранить информацию. Мы можем сделать это через команду ниже.

Чтобы запустить приложение, запустите Honcho Start -f Местный (Вам нужно установить Honcho, если вы еще не имеете). Если у вас есть какие-либо проблемы, вероятность, что они были адресованы в Readme Flask-base. Теперь вы можете посетить localhost: 5000 и поднимите бегущее приложение Flask-Base.

Чтобы войти в приложение в качестве администратора, перейдите к ссылке входа в систему и введите имя пользователя flask-base-admin@example.com с паролем пароль Отказ Затем вы можете пригласить новых пользователей в приложение с экрана администратора. Обратите внимание, что перед тем, как сделать это, вам нужно будет создать config.env Файл, который содержит следующие две переменные:

MAIL_PASSWORD=someSendGridPasswordMAIL_USERNAME=someSendGridUsername

При создании учетной записи пользователей учетная запись остается неподтвержденной до тех пор, пока новый приглашенный пользователь не нажимает ссылку, отправленную на их электронную почту. Кроме того, пользователь может зарегистрироваться для приложения и пройдет через аналогичный поток аутентификации в отношении подтверждения.

Посмотрите на базовую документацию на колбу, чтобы получить лучшее чувство некоторых возможностей колбы-базы из коробки. На данный момент мы собираемся перейти к тому, как мы можем использовать его, чтобы сделать наше приложение.

Базы данных!

Вся наша логика базы данных обернута SQLALCHEMY ORM, поэтому нам не нужно делать операторы баз данных в Verbose для запуска запросов или добавления/удаления записей. Вся база данных модели (думать о них как классы) содержатся в Приложение/Модели папка. Давайте подумаем о некоторых моделях, которые необходимы для самого приложения.

Поэтому нам нужно иметь Клуб Модель, которая содержит Имя клуба (DataType: String), клуб Описание (DataType: Text) и переменная IS_Confirmed (DataType: Boolean) Чтобы отслеживать, был ли предложенным клубом был одобрен администратором, который будет показан. Кроме того, мы хотим, чтобы какой-то способ обратиться к категориям клуба, а другой способ обратиться к вопросу о ответах, которые принадлежат клубу.

Давайте подумаем о том, как клубы и клубные категории должны относиться друг к другу. Мы можем думать об этом следующим образом. У клуба много категорий (например, клуб может быть социальное влияние и Tech Club) и категория клуба могут принадлежать к многим клубам (например, могут быть много Tech клубы в кампусе) Отказ Единственный атрибут это Clubcategory имеет Категория_name (DataType: String).

Мы можем создать эту связь (много для многих отношений), через таблицу ассоциации.

Клуб и клубные категории (многие для многих)

Теперь, как мы кодируем эту логику на базу Flask? Во-первых, создайте файл под названием Club.py в Приложение/Модели Отказ Сначала давайте создадим Клуб и Clubcategory модели.

Так что теперь у нас есть две модели, но они не связаны друг с другом. Каждый из них имеет отдельные атрибуты, но ни один не может быть явно подключен друг к другу. Мы делаем связь через ассоциацию, как я упомянул ранее. После дБ Импорт, добавьте следующие строки.

Что это делает, создает новую таблицу ассоциации (посредника между моделью Club and ClubCategory). В этой таблице есть два столбца Club_id и club_category_id которые относятся к соответствующему идентификатору их соответствующих моделей (обратите внимание, что атрибут ID является основным ключом в каждой модели, то есть то, что уникально для каждой записи). Но внутри таблицы ассоциации мы ссылаемся на эти первичные ключи как иностранные ключи (потому что они ссылаются на другие таблицы). Кроме того, нам нужно добавить строку в Клуб модель внизу.

categories = db.relationship(        'ClubCategory', secondary=club_category_assoc, backref='clubs')

И это на самом деле создает двунаправленные отношения между Клуб и Clubcategory модели и устанавливают отношения между Клуб и Clubcategory используя club_category_assoc Таблица ассоциации. Backref рассказывает Clubcategory Модель Как обратиться к Клуб модели. Итак, с данным клубом Клуб , вы можете запустить Club.Категории Чтобы получить массив обратно на объект категории. С данным Clubcategory называется категория , вы можете получить все клубы в этой категории, делая Категория .Клюбы Отказ

Вы можете увидеть это в действии, выполнив следующее:

В Приложение/Модели/__ init__.py Добавить линию

А потом беги Python Manage.py Shell Отказ Запустите следующие команды, чтобы взаимодействовать со своими моделями базы данных (обратите внимание, что > ; >> указывает на вход, который вы размещаете).

Вопросы и ответы (много к одному)

Большой! Теперь у нас есть рабочий клуб и модель ClubCategory. Теперь давайте перейдем на Вопрос:| и Ответ модели. На вопрос нам нужно отслеживать Содержание Вопрос, который будет строка, содержащая текст самого вопроса. Мы также включим max_rating Атрибут, который будет содержать максимальный рейтинг, человек может дать на вопрос. Например, если утверждение вопроса «Оценить сообщество клуба 10, является лучшим», мы могли бы установить max_rating Быть 10. Дополнительно мы отслеживаем логию Free_Response Чтобы определить, позволим ли мы людям включать дополнительный дополнительный ответ, который является длительной формой. Наконец, нам нужно будет иметь отношение к Ответ модель. Это будет однозначное соотношение, потому что вопрос может иметь несколько ответов, но ответ может иметь только один вопрос.

Ответ Модель будет иметь следующие атрибуты:

  • Ответ атрибут, соответствующий свободный текстовый ответ ответа (если вопрос предоставляет бесплатный текстовый ответ)
  • А Рейтинг начиная от 1 до того, что является максимальным рейтингом для вопроса
  • А user_id Относительно пользователю, который написал вопрос (еще раз, когда пользователь может иметь много ответов, но ответ может иметь только один пользователь)
  • А Вопрос_id Ссылаясь на Вопрос:| что ответ принадлежит А
  • Club_id Ссылаясь на Клуб ответ принадлежит

Давайте создадим файл вопрос

Большинство вещей здесь довольно просты, за исключением последней линии. Последняя строка соединяет Вопрос:| и Ответ модели. Он говорит, чтобы создать отношения с Ответ Модель, которая может обратиться к Вопрос:| Модель по ключевому слову Вопрос:| Отказ Учитывая ответ А Вы можете получить вопрос через A.Question и дал вопрос Q , вы можете получить ответ, связанный с ним через Q.Answers Отказ Давайте теперь настроим Ответ модель. Создайте новый файл под названием Ответ.пи в папке моделей и вставьте в следующем.

Таким образом, этот файл гораздо дольше, но напомнить, что есть много вещей, с которым связан ответ. Давайте начнем в начале, обратите внимание, что Вопрос_id относится к Вопрос:| Модель через внешний ключ вопросы (ID ID Столбец Вопросы Таблица (которая содержит записи экземпляров Вопрос Модель).

Обратите внимание, что у нас также есть user_id столбец, который относится к пользователю. Давайте пойдем в user.py в пределах Приложение/Модели Папка и добавьте следующую строку после ROLE_ID Декларация.

Это утверждение использует очень похожий синтаксис для этого из Вопрос:| модель.

Также обратите внимание, что есть Club_id атрибут, который относится к клубу, с которым связан ответ. Изменить Club.py Файл, чтобы включить следующую строку в качестве последнего атрибута Клуб модель.

Наконец, добавьте эти две линии на __init__.py в приложение/модели

И теперь мы должны быть в состоянии играть с нашими базами данных следующим образом.

Наконец, давайте обратимся к Newanswer метод. Этот метод используется для вставки новых ответов в базу данных, убедившись, что если пользователь уже ответил на этот вопрос, мы его удаляем и вставьте новый ответ.

Еще раз мы можем запустить Python Manage.py Shell.

Там мы сейчас сделаны с моделями:)

Взгляды

Теперь база данных базы данных не проходит, давайте создадим способ для пользователей взаимодействовать с самой приложением. Сначала давайте создадим некоторые чертежи.

Чертежи

Чертежи – отличный способ организовать приложение Flask. Это позволяет устанавливать все маршруты, которые связаны друг с другом в одном файле. Например, для всех действий, связанных с учетной записью, такими как управление учетными записями, сброс пароля пользователя, забыл пароль и т. Д. Был бы включен в учетная запись Чертеж.

Каждый план имеет папку, связанную с ней под приложение Отказ Например, есть аккаунт/ Папка и папка под Шаблоны Содержащие фактические шаблоны HTML, которые будут отображаться пользователю.

Давайте добавим некоторые чертежи. До Вернуть приложение линия Приложение/__ init__.py Добавьте следующее.

Эти звонки создают чертежи, установленные на префиксе URL /Клуб , /вопрос и /категория соответственно. Давайте создадим папки Клуб , Вопрос:| и категория для каждого из чертежей. В каждом из папок создают файлы __init__.py , Формасс и просмотр .py Отказ

Клубные формы и взгляды

Я пройду, как настроить вид/шаблоны для Клуб Чертеж. Другие взгляды довольно легко понять из кода.

Так что в пределах клуба мы хотим иметь несколько разных вещей, чтобы показать

  1. Если вы являетесь администратором, вы сможете создать клуб и дать ему имя, описание и категории.
  2. Если вы являетесь администратором, вы сможете просмотреть все клубы, в том числе те, которые не подтверждены.
  3. Если вы являетесь администратором или пользователем, вы сможете просмотреть индивидуальные клубы информацию.
  4. Если вы администратор, вы должны уметь редактировать информацию клуба и удалить клуб.

Давайте сначала создадим пару форм внутри Формасс То, что мы перейдем к нашим взглядам, в частности, представление, которое обрабатывает новый клуб и тот, который редактирует информацию о клубе.

В Формасс для Клуб Добавьте следующие строки:

Флэк-база использует WTForms создавать формы. WTForms позволяет нам создавать формы в ориентированном объекте, где каждая форма является классом.

Итак, мы создаем две формы, которые называются Newclubform это расширяет базу WTForms Форма Класс, а имеет 3 поля – Имя (DataType: Text), Desc (DataType: Text), содержащий описание клуба и Категории (несколько выборов выбора). С Категории поле, мы запрашиваем Clubcategory Модель с функцией лямбда (которая в основном является анонимной функцией) для имени категорий и заполнения категории Выберите параметры поля с результатами этого запроса.

Наконец, у нас есть Отправить Поле, поэтому кнопка отправки может быть отображена.

Далее у нас есть EditClubform который расширяет Newclubform Поле, установленное путем добавления нового поля под названием IS_Confirmed Отказ Напомним, что IS_Confirmed в нашем Клуб Модель определяет, может ли данный экземпляр клубного экземпляра или не показан общественности. Мы будем добавлять функцию для предложенного пользователями клуба, и по умолчанию предложенные клубы скрыты до тех пор, пока не одобрено администратором. Мы также перезаписываем Отправить Поле для отображения текста «Редактировать клуб».

В просмотр .py под Клуб/ Мы создаем несколько маршрутов.

  • /New-Club (Get, Post) защищены в системе: рендеры и принимают данные из формы для создания нового клуба.
  • /Клубы (Получить) администратор защищен: оказывает все клубы
  • //( : info) (Get) Защищена вход: вырещите информацию о данном экземпляре клуба с lub_id и может получить доступ к маршруту в/Club/1 или/Club/1/info.
  • //feart-club-d Outails (Get, Post) Admin Protected: рендеринг и принимайте данные из формы для редактирования информации о клубе.
  • // Удалить (Get) Admin Protected: Render Page, чтобы удалить клуб
  • //_ Удалить (получить) Admin Protected: Удалить клуб с клубом ID.

Для первого маршрута /New-Club Мы хотим также разрешить регулярным пользователям создавать новый клуб, поэтому мы только вхожу в систему, защищаем его. Давайте посмотрим, как мы можем сделать маршрут для этого.

Ломать код. В очереди 1, мы объявляем, где будет доступна маршрут. Например, это будет на Клуб План на подпортном пути /Новый клуб. Полный URL его можно получить в том, это BASTOMAIN.com/Club/new-Club Отказ

Затем мы поставили маршрутный декоратор @Login_requireed На маршруте этот декоратор бросит ошибку 403, если пользователь не вошел в систему, но также позволит пользователю просматривать маршрут, если они вошли в систему.

Затем мы определяем способ для обработки запросов к маршруту (обратите внимание, что это имя должно быть уникальным). Этот метод можно упомянуть club.new_club в шаблоне Jinja.

Затем мы создали наш Newclubform Мы создали ранее. В следующей строке мы проверяем, был ли действителен ли представление формы (обратите внимание, что этот маршрут также примет к нему сообщение Post) через form.validate_on_submit () метод. Если это так, то мы создаем новый Клуб экземпляр с Имя , Описание и Категории соответствует полям формы. Примечание для IS_Confirmed Мы устанавливаем оно равным, является ли текущий пользователь администратором или нет (потому что если регулярный пользователь представляет эту форму, мы хотим, чтобы новый клуб не появился всем, следовательно, мы устанавливаем IS_Confirded на false). Затем мы добавим новый клуб к сеансу базы данных и зафиксируйте сеанс.

Наконец, если пользователь, отправляющий форму не является администратором, мы генерируем ссылку для отправки администратору формы по электронной почте. Эта ссылка должна идти непосредственно к администратору change_club_details Маршрут, который позволит администратору поместить IS_Confirmed Отказ Затем мы просматриваем базу данных для всех пользователей с ролью администратора и добавьте задачу по электронной почте в нашу очередь Redis. В пределах get_queue () Метод, мы ждем send_email работа конкретно, установка получателя в электронную почту администратора, предмет, равный

Добавьте экземпляр клуба (для использования в качестве переменной шаблонов), а ссылка (также будет использоваться в качестве переменной шаблонов).

Мы также передаем Шаблон Что мы создаем в Приложение/Шаблоны/Club/Email/Repreet_club.html и .txt Отказ Содержание выглядит следующим образом для HTML-файла:

и для файла .txt

Далее мы позаботимся о /Клубы Маршрут, который делает все клубы в таблице. Для обработчика маршрута мы можем просто пройти во всех клубах в шаблон.

И шаблон клуба мы представляем, находится в Приложение/Шаблоны/Club/Clubs.html со следующим контентом.

Большинство из этого довольно просты, если вы знаете Jinja (или любой язык шаблонов). В основном, для петли {% для C в клубах%} ... {% EndFor%} пройдет все клубы и для каждого клуба, он окажет клубное имя {{c.name}} и клубные категории.

Обратите внимание, что для каждого из оказанных клубов мы также включаем строку:

Это ссылки на отдельную страницу информации о клубе для данного экземпляра клуба, который оказывается. Давайте перейдем к этому маршруту.

Обратите внимание, что для этого представления нам нужно только передать информацию об экземпляре Club к представлению Manage_Club. Мы можем сделать это легко через:

Мы также можем настроить несколько других маршрутов, потому что наша manage_club.html Страница на самом деле отображает несколько маршрутов.

Давайте настроим /Меменные-клубные детали Маршрут, который просто оказывает и принимает информацию от EditClubform форма.

Обратите внимание, что при сохранении Club.is_confirmed поле, нам нужно преобразовать строку Правда и Ложь ценности их логическими коллегами, как указано в Формасс Спецификация для EditClubform Отказ Мы делаем это через пользовательскую определенную функцию Bool который определяется следующим образом:

Python по умолчанию Bool вернется Правда Если какая-либо строка определена, включая False ' Следовательно, нам нужно определить нашу собственную функцию.

Мы также определяем Удалить Чтобы сделать страницу удаления и _delete Функция, которая фактически удаляет экземпляр клуба.

Обратите внимание, что для _delete Маршрут, у нас есть перенаправление по отношению к Клубы Маршрут, который перечисляет все экземпляры клуба.

Теперь мы переходим к manage_club.html Шаблон на Приложение/Шаблоны/Club/Manage_Club.html Отказ Содержание которого выглядит следующим образом:

Давайте сломаем этот файл. На первой строке мы просто расширяем нашу базовую планировку, а затем импортируем макросы формы. Макросы в основном методы в Jinja.

У нас есть конечные точки Переменная, которая будет содержать ссылки на различные части страницы управления. В навигация Макрос, мы оказываем все отдельные элементы списка в конечные точки Отказ

Мы также создаем Club_info Макрос, который будет содержать информацию, связанную с клубом, и все ответы, связанные с клубом, выполняя следующие

Наконец, мы на самом деле пишу логику для рендеринга страницы в {% Block Content%} ... {% Endblock%} Теги. Переключаем между подрасполми, чтобы рендер, проверив request.endpoint Чтобы увидеть, является ли это конечная точка удаления или если есть форма (в этом случае визуализация формы). В противном случае мы просто называем Club_info макрос И мы закончили с клубными маршрутами и просмотром. Большинство других маршрутов для категории и вопросов следуют аналогичному типу логики.

Основные взгляды и формы

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

  • /(Get): отображение всех клубов, связанных вопросов и средних рейтингов для каждого клуба на вопрос в таблице.
  • /Отправить-обзор/ (get, post): динамически генерировать форму, чтобы представить обзор клуба на основе вопросов в «вопросах) DB. Также принимайте данные для формы и сохраните как ответы на Club Club_id.

Первый маршрут очень просты и соответствует маршруту «/Clubs», который мы реализованы ранее. Единственное отличие состоит в том, что «вопросы» также должны быть переданы.

Самая интересная часть вот как рассчитать средний рейтинг и передать это в маршрут. Я создаю список под названием all_c А для каждого из клубов я создаю Club_obj Содержащие базовой информации для Club.F или каждого из ответов на клуб, я добавляю новую собственность Club_obj корреponding к вопросу содержания, если никто не существует. Я добавляю каждый из рейтингов в список, а затем итерации через каждый из свойств Club_obj Отказ Если свойство имеет значение, которое имеет тип списка, то я заменил этот список со средним рейтингом в этом списке. Я тогда добавляю Club_obj к all_c и пропустите это в шаблон.

Динамический генератор формы

Для Отправить-Обзор Маршрут, мне нужно создать форму динамически на основе вопросов, которые у меня есть в моем Вопрос:| модель. Код выглядит следующим образом:

Сначала мы создаем манекенский класс формы, который наследует от базы Форма класс. Тогда для каждого из вопросов мы ориентируемся на новые поля формы setattr (f, ...) На фиктивной форме F Отказ setattr Метод принимает в качестве второго аргумента имя поля формы. Мы устанавливаем это на ID вопроса с _q прилагается к нему, соответствующий рейтингу и _resp соответствует бесплатным ответам, если указано. Для поля рейтинга формы, мы создаем Selectfield с вариантами от 1 до max_rating Отказ

Чтобы обработать представление формы, мы используем то же самое, если заявление form.validate_on_submit () Но вместо того, чтобы искать специфические именованные поля формы, мы вместо этого проиграем через все поля Форма и создать новый ответ, используя Newanswer метод. Этот метод удалит любой предыдущий ответ перед добавлением нового для пользователя, если они ответили на этот клуб.

Запуск

Теперь, когда большинство приложений сделано, мы можем запустить это приложение на Heroku.

Если вы никогда не подписались с Heroku

  1. Перейти к heroku.com и подписаться на аккаунт
  2. Установите CLI

Если вы не создали Git Refo изначально, запустите Git init И войти с вашей учетной записью Heroku.

Тогда Git Добавить Все соответствующие файлы (то есть что-нибудь, кроме config.env и venv/ ) и запустить PIP Freeze> требования. TXT, чтобы убедиться, что все установленные вами зависимости включены.

Беги Heroku создать сделать новый экземпляр Heroku и запустить Git Push Heroku Master Чтобы добавить ваши файлы в репозиторий Heroku.

После этого выполняется работает, вам нужно установить некоторые переменные среды со следующей командой

Как только это сделано, запустите следующее, что создаст базу данных на Heroku

А затем следующая команда создаст учетную запись администратора.

Вам также необходимо будет создать экземпляр TOGO REDIS для обработки очереди задач

И наконец запустить следующую команду, которая скажет Heroku, чтобы раскрутить динамику (читать как подси-сервер), который обрабатывает наш очередь Redis.

Вы можете запустить Heroku Open Чтобы открыть ваше приложение Heroku в отдельном окне.

Расширение приложения и заключения

Довольно легко скопировать текущую структуру приложений и продлить его, чтобы добавить дополнительную информацию/маршруты в приложение. Просто просмотрите любой из предыдущих маршрутов, которые были реализованы. Если по какой-то причине вы хотите включить файл загрузки некоторых типов, вам нужно будет интегрировать приложение с Amazon S3, если вы планируете запустить приложение на Heroku (так как у него есть эфемерная файловая система).

В целом, Flask-Base обеспечивает отличную отправную точку для приложения вашей колбы. Конечно, бэкэнда может быть довольно многослойной для кода, но в результате он дает вам очень гранульный контроль над вашим приложением.