Aiohttp python что это
Перейти к содержимому

Aiohttp python что это

  • автор:

Первые шаги в aiohttp

Привет, меня зовут Артём. Я работаю бэкендером в KTS и веду курсы по разработке в KTS Metaclass. Заметил, что труднее всего студентам даются темы по асинхронному программированию.

Основываясь на своём преподавательском опыте, я написал туториал, рассказывающий о создании базового aiohttp-сервиса с нуля и затрагивающий самые сложные для студентов вопросы: как сделать асинхронное python-приложение, как работать с базой данных и как разложить свой проект в интернете.

В цикле статей мы рассмотрим следующие темы:

  1. Архитектура веб-приложения
  2. Асинхронная работа с базой данных и автоматические миграции
  3. Работа с HTML-шаблонами с помощью Jinja2
  4. Размещение нашего приложения в Интернете с помощью сервиса Heroku
  5. А также сигналы, обработку ошибок, работу с Docker и многое другое.

Эта статья – первая из трех, и ее цель — помочь начинающим aiohttp-программистам написать первое “hello-world” приложение.

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

Мы пройдем по шагам:

  • Создание проекта
  • Структура проекта
  • Создание View
  • Создание Route
  • Создание шаблона
  • Запуск приложения

Создание проекта

Все команды в статье были выполнены в операционной системе OSX, но также должны работать в любой *NIX системе, например в Linux Ubuntu. Во время разработки я буду использовать Python 3.7.

Давайте создадим папку aiohttp_server, которая в дальнейшем будет называться корнем проекта. В ней создадим текстовый файл requirements.txt, который будет содержать все необходимые для работы приложения зависимости и их версии. Запишем в него следующие модули:

aiohttp==3.7.3 # наш фрейворк aiohttp-jinja2==1.4.2 # модуль для работы с HTML-шаблонами

Создадим виртуальное окружение – что-то вроде песочницы, которое содержит приложение со своими библиотеками, обновление и изменение которых не затронет другие приложение, и установим в него наши зависимости:

cd /aiohttp_server python3 -m venv venv source venv/bin/activate

После этого в начале строки терминала должна появится надпись (venv) — это означает что виртуальное окружение успешно активировано. Установим необходимые модули:

pip install -r requirements.txt

Структура проекта

Создадим в папке aiohttp_server следующую структуру:

├── app │ ├── __init__.py │ ├── forum │ │ ├── __init__.py │ │ ├── routes.py # тут будут пути, по которым надо отправлять запросы │ │ └── views.py # тут будут функции, обрабатывающие запросы │ ├── settings.py ├── main.py # тут будет точка входа в приложение ├── requirements.txt └── templates └── index.html # тут будет html-шаблон страницым сайта

Теперь откроем файл main.py и добавим в него следующее:

from aiohttp import web # основной модуль aiohttp import jinja2 # шаблонизатор jinja2 import aiohttp_jinja2 # адаптация jinja2 к aiohttp # в этой функции производится настройка url-путей для всего приложения def setup_routes(application): from app.forum.routes import setup_routes as setup_forum_routes setup_forum_routes(application) # настраиваем url-пути приложения forum def setup_external_libraries(application: web.Application) -> None: # указываем шаблонизатору, что html-шаблоны надо искать в папке templates aiohttp_jinja2.setup(application, loader=jinja2.FileSystemLoader("templates")) def setup_app(application): # настройка всего приложения состоит из: setup_external_libraries(application) # настройки внешних библиотек, например шаблонизатора setup_routes(application) # настройки роутера приложения app = web.Application() # создаем наш веб-сервер if __name__ == "__main__": # эта строчка указывает, что данный файл можно запустить как скрипт setup_app(app) # настраиваем приложение web.run_app(app) # запускаем приложение

После предварительной настройки можно создать первый View.

Первый View

View — это некий вызываемый объект, который принимает на вход HTTP-запрос — Request и возвращает на пришедший запрос HTTP-ответ — Response.

Http-запрос содержит полезную информацию, например url запроса и его контекст, переданные пользователем данные и многое другое. В контексте запроса содержатся данные, которые мы или aiohttp добавили к этому запросу. Например, мы предварительно авторизовали пользователя — чтобы повторно не проверять авторизацию пользователя из базы во всех View и не дублировать код, мы можем добавить объект пользователя в контекст запроса. Тогда мы сможем получить нашего пользователя во View, например, так: request[‘user’].

HTTP-ответ включает в себя полезную нагрузку, например, данные в json, заголовки и статус ответа. В простейшем View, который из примера выше, всю работу по формированию HTTP-ответа выполняет декоратор @aiohttp_jinja2.template(«index.html») . Декоратор получает данные из View, которые возвращаются в виде словаря, находит шаблон index.html (о шаблонах написано ниже), подставляет туда данные из этого словаря, преобразует шаблон в html-текст и передает его в ответ на запрос. Браузер парсит html и показывает страницу с нашим контентом.

В файле views.py в папке app/forum напишем следующий код:

import aiohttp_jinja2 # создаем функцию, которая будет отдавать html-файл @aiohttp_jinja2.template("index.html") async def index(request): return

Здесь создается функциональный View (function-based View). Определение “функциональный” означает, что код оформлен в виде функции, а не классом (в следующей части мы коснемся и class-based View).

Рассмотрим написанную функцию детальнее: функция обернута в декоратор @aiohttp_jinja2.template(«index.html») — этот декоратор передает возвращенное функцией значение в шаблонизатор Jinja2, а затем возвращает сгенерированную шаблонизатором html-страницу как http-ответ. В данном случае возвращенным значением будет словарь, значения которого подставляются в html-файл index.html.

Отдельно стоит заметить, что объект запроса request передается как аргумент функции index. Мы не используем request в этой функции, но будем использовать в дальнейшем.

HTTP-запрос отправляется на конкретный url-адрес. Для передачи HTTP-запроса в нужный View необходимо задать эту связь в приложении с помощью Route.

Первый Route

Route — это звено, связывающее адрес, по которому был отправлен запрос и код View, в котором этот запрос будет обработан. То есть, если пользователь перейдет в корень нашего сайта (по адресу /), то объект запроса будет передан в View index и оттуда же будет возвращен ответ. Подробней про Route можно прочитать тут.

В файл routes.py необходимо добавить следующий код:

from app.forum import views # настраиваем пути, которые будут вести к нашей странице def setup_routes(app): app.router.add_get("/", views.index)

Первый Template

Теперь нам осталось только добавить в templates/index.html код верстку нашей страницы. Его можно найти по этой ссылке.

Template — это html-шаблон, в который подставляются данные, полученные в результате обработки запроса. В примере в коде View отдается словарь с ключом title, шаблонизатор Jinja2 ищет в указанном html-шаблоне строки > и заменяет их на значение из словаря по данному ключу. Это простейший пример, шаблоны позволяют делать намного больше: выполнять операции ветвления, циклы и другие операции, например, суммирование. Примеры использования можно посмотреть в документации jinja2.

Запуск приложения

Мы создали первую версию нашего приложения! Осталось запустить его следующей командой в терминале (убедитесь, что находитесь в папке aiohttp_server):

python3 main.py

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

======== Running on http://0.0.0.0:8080 ======== (Press CTRL+C to quit)

Давайте теперь посмотрим результаты нашей работы! Для этого перейдите по адресу http://0.0.0.0:8080 в браузере. Вы должны увидеть первую версию нашего приложения. При клике на кнопку “Отправить” должно возникнуть сообщение о том, что отзыв отправлен.

Поздравляю! Вы успешно создали первое приложение на aiohttp!

Заключение

В статье рассмотрено создание простого приложения на aiohttp, которое принимает запрос пользователя и отдает html-страницу. Мы затронули:

  • Настройку виртуального окружения
  • Базовую настройку проекта на aiohttp
  • Создание View
  • Создание Route
  • Использование html-шаблонов

Наше приложение представляет собой простой веб-сервер, отдающий html-страницу по запросу — в нем нет никакого взаимодействия с базами данных, его структура максимально проста и оно недоступно пользователям в Интернете. В следующих статьях мы разберем, как вырастить из нашей заготовки “настоящее” веб-приложение на aiohttp и опубликовать его в Интернете.

Весь код статьи можно найти на гитхабе.

Полный цикл статей «Первые шаги в aiohttp»:

  • Пишем первое hello-world-приложение
  • Подключаем базу данных
  • Выкладываем проект в Интернет

Другие наши статьи по бэкенду и асинхронному программированию для начинающих:

  • Визуализация 5 алгоритмов сортировки на Python
  • Разбираемся в асинхронности: где полезно, а где — нет?

Другие наши статьи по бэкенду и асинхронному программированию для продвинутого уровня:

  • Пишем свой Google, или асинхронный краулер с rate limits на Python
  • Пишем асинхронного Телеграм-бота
  • Пишем Websocket-сервер для геолокации на asyncio
��Асинхронное программирование на Python для джуниор-разработчиков��

Асинхронное программирование используется для высоко­нагруженных проектов и микросервисов. Его спрашивают на собеседованиях в технологически развитых компаниях, и оно открывает дорогу к работе в интересных проектах. Если вы уже пишете на Python, но пока не изучили модуль Asyncio, приглашаю вас на курс по асинхронному программированию на Python.

  • Разберётесь, как работает асинхронное программи­рование и где его лучше применять.
  • Получите опыт работы с микросервисами.
  • Освоите стандартную python-библиотеку Asyncio, напишите чат-бота и event loop.

Aiohttp python что это

Aiohttp — асинхронный HTTP-клиент/сервер для модуля asyncio. Это библиотека языка Python, которая нужна для выполнения клиентских запросов и создания веб-сервера с потоковой выдачей и веб-сокетами.

Простым языком, Aiohttp — это технология, которая помогает приложению (сервер) и его пользователям (клиенты) быстрее и обмениваться данными. От того, насколько хорошо реализована эта связь, зависит производительность вашего веб-проекта.

Есть несколько способов реализовать HTTP-клиент для проектов на Python, но Aiohttp — самое популярное решение, быстрое и легко масштабируемое, которое используется практически по умолчанию.

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

Обзорный анализ Python веб-фреймворков

Посмотрим, что выгодно отличает фреймворки Python от фреймворков в других языках и разберём, в чём они конкурируют между собой.

Вместе с ML и data scince, web является одним из трёх китов, на которых стоит популярность языка Python. В данном анализе опустим все прелести Python и рассмотрим только веб-инструментарий, то есть фреймворки. Посмотрим, что выгодно отличает их от фреймворков в других языках, и разберём, в чём они конкурируют между собой.

Полезен такой разбор, думаю, будет в первую очередь тем, кто только входит в веб-разработку на Python. А также тем, кто не знает к изучению какой следующей технологии приступить.

Судя по анализу 60 вакансий на позицию Python-разработчика на портале dou.ua, сегодня на рынке востребованы следующие фреймворки (для каждой технологии указано количество связанных вакансий):

Django — 21;Flask — 13;Aiohttp — 5;FastAPI — 4;Falcon — 1;Bottle — 1.

В виде диаграммы представить данную информацию можно так:

Для меня оказалось неожиданным, что Django упомянут в большинстве вакансий. Ещё удивило присутствие Bottle.

Определим критерии для сравнения инструментов:

  • документация — насколько читабельна, полна и актуальна документация проекта. Бонусы при оценке получат проекты, имеющие детальные туториалы;
  • комьюнити — наличие сообщества единомышленников-разработчиков, работающих с данной технологией и масштабы такого сообщества;
  • архитектура — насколько логично и в соответствии с паттернами проектирования построена структура фреймворка;
  • функционал — встроенный функционал фреймворка, который покрывает нужды разработчика без подключения сторонних модулей;
  • настройка — насколько фреймворк легко настроить и насколько управляем проект, работающий под фреймворком.

Итак, перейдём к самому анализу и начнём, пожалуй, с фаворита рынка — Django.

Django

История этого фреймворка Python начинается в 2003 году, когда разработчики из американской газеты Lawrence Journal-World решили пилить феб-приложения на Python. Уже в 2005 году ребята выкатили в свободное плавание своё детище как веб-фреймворк.

Чем Django так хорош?

Модульность и расширяемость

Во-первых, к модульности принуждает MTV (model-template-view) архитектура фреймворка. С бизнес-логикой приложения, его визуальным оформлением, структурой данных, разработчик работает отдельно.

Хорошая практика в Django — выделять логически обособленный функционал приложения в отдельный application внутри фреймворка. По сути, вы легко компонуете проект из апликейшинов как из конструктора лего.

В Django присутствует каталог на сотни плагинов, которые решают задачи от настройки sitemap до развёртывания полноценной CMS и создания REST API.

Помимо предусмотренных разработчиками фреймворка решений, достаточно просто подключаются аналоги (например Jinja2 вместо стандартного шаблонизатора Django). Хотя заменить, например, ORM достаточно тяжело.

Развитая экосистема

Как я уже упомянул, существуют сотни плагинов для Django, решающих ряд насущных нужд. Помимо сахара в виде таких плагинов фреймворк самодостаточен. «Из коробки» встроены ORM, шаблонизатор, мультиязычность, админ-панель, автоматическая документация и так далее.

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

Стабильность

В некой мере этот пункт можно отнести и к экосистеме. Django имеет полную и достаточно качественную документацию. Существуют её переводы — в том числе и на русский язык.

Сообщество разработчиков на Django насчитывает тысячи человек. На любой вопрос разработчик гарантированно найдёт ответ.

Фреймворк используется с 2005 года, и за 16 лет множество багов было устранено, а фич реализовано и улучшено.

Django развивается и поддерживается огромным комьюнити. Django Software Foundation — это некоммерческая организация, которая поддерживает обучение фреймворку, его развитие и распространение.

На Django написаны YouTube, Pinterest, Google. А такие проекты, работающие на Django, подтверждают стабильность экосистемы при работе с большими нагрузками.

Минусы Django:

Для небольших проектов функционал Django избыточен, но в то же время возможности асинхронности в нём весьма ограничены. Поэтому для работы с легкими или асинхронными проектами предпочитают использовать другие фреймворки. Многие встроенные модули достаточно тяжело заменить — админ-панель не всегда легко кастомизировать, а про ORM я уже упоминал. И она, кстати, значительно уступает по гибкости SQLAlchemy.

Итоги:

  • документация — 5;
  • комьюнити — 5;
  • архитектура — 4;
  • функционал — 4;
  • настройка — 5.

Flask

Flask был создан в 2010 году австрийским программистом Армином Ронахером в качестве первоапрельской шутки. В одном проекте он попробовал собрать свои библиотеки — шаблонизатор Jinja и Werkzeug — инструментарий для WSGI (стандартного интерфейса Python между веб-сервисами). В результате вышел фреймворк Python, о котором мы сейчас и говорим.

За что любят Flask?

Лёгкость

По своей сути Flask — это скелет, на который разработчик может навесить любой удобный для него инструментарий. Причём этот инструментарий не навязывается фреймворком, как в случае с Django. Например, выбирая Flask для проекта, разработчик волен в выборе ORM. Как правило, выбор падает на SQLAlchemy.

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

По умолчанию Flask предоставляет:

  • сервер разработки и отладчик;
  • интегрированные инструменты для модульного тестирования;
  • возможность отправки REST запросов;
  • шаблонизатор Jinja2;
  • пакеты-расширения, например flask-login, flask-sqlalchemy, flask-wtf.
Комьюнити

По состоянию на 2016 год, репозиторий с Flask был самым популярным репозиторием Python на GitHub. В него было внесено более 3 тысяч изменений, у него больше 29 тысяч звезд, а за изменениями следят почти 2 тысячи пользователей. Более 250 разработчиков внесли свой вклад.

Благодаря Flask работают Pinterest и LinkedIn.

Поиск ответа на вопросы, связанные с фреймворком, не займёт много времени как и в случае с Django.

Документация

Документация по Flask покрывает практически все возможные вопросы связанные с фреймворком и имеет перевод на русский язык. Она покрывает в том числе разные варианты развёртывания приложения и вопросы подключения сторонних модулей к проекту. Например SQLAlchemy.

Минусы Flask:

Несмотря на все плюсы и простоту фреймворка, он остаётся всего лишь ядром, которое зависит от двух внешних библиотек (Jinja и Werkzeug) и к которому прикрепляются сторонние инструменты.

Flask — песочница для программистов, где можно отточить свои навыки и протестировать решение с помощью нового модуля или библиотеки. Из этого достоинства фреймворка следует и его минус — структура и логика проекта полностью зависят от разработчика, работавшего над проектом.

Итоги:

  • документация — 5;
  • комьюнити — 5;
  • архитектура — 3;
  • функционал — 3;
  • настройка — 4.

Aiohttp

Aiohttp — это веб-сервер для asyncio. Соответственно имеет весьма ограниченный функционал как самостоятельный инструмент и предназначен для решения узкого круга задач.

В чём особенность инструмента?

Столп на котором базируется Aiohttp — вебсокеты.

Веб-сокетам, в отличие от обычных HTTP-запросов, для ответа не нужны повторяющиеся запросы. Достаточно единожды выполнить запрос и ждать отклика. То есть просто слушать сервер, который будет отправлять вам сообщения по мере готовности.

Веб-сокеты стоит использовать в:

  • приложениях реального времени;
  • чат-приложениях;
  • IoT-приложениях;
  • многопользовательских играх.

Минусы

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

Итоги:

  • документация — 3;
  • комьюнити — 3;
  • архитектура — 3;
  • функционал — 3;
  • настройка — 4.

FastAPI

FastAPI — фреймворк Python для лёгкого создания API-серверов со встроенными валидацией, сериализацией и асинхронностью. Стоит он на плечах двух других фреймворков. Работой с web в FastAPI занимается Starlette, за валидацию отвечает Pydantic.

Возможности:

  • из коробки возможность работы с GraphQL;
  • встроенные вебсокеты;
  • встроенная аутентификация/автроизация, поддержка JWT, OAuth2;
  • автоматическая документация.

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

Минусы FastAPI

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

Итоги:

  • документация — 5;
  • комьюнити — 3;
  • архитектура — 5;
  • функционал — 4;
  • настройка — 3.

Falcon и Bottle

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

Falcon как правило, позиционируется как более быстрый аналог легко масштабируемой API вместо стандартного инструментария Фласка.

Bottle, в свою очередь — как минимальный набор базовых инструментов для работы с вебом, включающий в себя работу с шаблонами и обработку форм.

Следите за новыми постами по любимым темам

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

Пишем первое приложение на aiohttp: подготовка и запуск.

Привет! Меня зовут Артём, я работаю backend-разработчиком в KTS Studio. Недавно я вел лекцию в бесплатной школе python-разработки, дважды в год проходящей в нашей компании, и, в процессе подготовки материалов, получилась эта статья. Она рассчитана на студентов, которые прошли отбор на наши курсы, то есть на людей, которые уже имели небольшой опыт веб-разработки и умеют создавать на Python’е несложные программы. Приятного чтения!

Скорее всего мало кого удивит тот факт, что на Python’е можно написать свое веб-приложение. Такие слова как Flask и Django слышал почти каждый программист, хоть как-то связанный с Python или веб-программированием вообще. Эти фреймворки популярны, просты и достаточно производительны для большинства задач, возникающих при написании API или даже полноценного веб-приложения. Что же такое aiohttp и зачем нужен еще один веб-фреймворк на Python?

Как сказано в официальной документации:

Aiohttp — ассинхронный HTTP клиент и сервер, созданный для asyncio и Python

В чем же его преимущества перед более классическими Django и Flask? Одно из ключевых преимуществ указано в определении — он создан для asyncio, библиотеки для написания асинхронного кода на Python, в то время, как код на Django и Flask (традиционно) исполняется синхронно. То есть, веб-приложение на aiohttp в теории, а бенчмарки производительности лишь подтверждают эту теорию, может быть в несколько раз эффективнее такого же по функциональности приложения на Django или Flask.

Aiohttp позволяет создавать сложные веб-приложения, и, если судить по моему личному опыту, не уступает им по скорости разработки. Хорошая документация, примеры в сети и это руководство позволят быстро написать качественный и, что не менее важно, производительный сервис. Aiohttp в разработке используют такие компании как Yandex, Wargaming, Rambler и Skyscanner.

В конце каждой статьи будет ссылка на исходный код на github’е. В репозитории также хранится папка с необходимыми зависимостями venv/. Хранение зависимостей в репозитории в большинстве случаев неправильно, но в данном случае это сделано для немедленного запуска приложения. Если вы будете запускать приложение, скачанное из репозитория, не забудьте активировать виртуальное окружение командой source venv/bin/activate , выполненной в терминале из корня проекта.

Сегодня мы напишем небольшое веб-приложение на aiohttp — стену с отзывами, где каждый может оставить свое мнение о каком-то продукте. В процессе мы создадим расширяемую архитектуру веб-приложения на aiohttp, а также рассмотрим такие темы как:

  • Архитектура веб-приложения
  • Асинхронная работа с базой данных и автоматические миграции
  • Работа с HTML-шаблонами с помощью Jinja2
  • Размещение нашего приложения в Интернете с помощью сервиса Heroku

А также сигналы, обработку ошибок, работу с Docker’ом и многое другое.

Подготовка

Все команды в статье были выполнены в операционной системе OSX, но также должны работать в любой *NIX системе, например в Linux Ubuntu.

Во время разработки я буду использовать Python 3.7.

Давайте создадим папку aiohttp_server, которая в дальнейшем будет называться корень проекта, и в ней создадим текстовый файл requirements.txt, в который запишем необходимые зависимости:

aiohttp==3.7.3 # наш фрейворк 
aiohttp-apispec==2.2.1 # модуль для автоматической документации
aiohttp-jinja2==1.4.2 # модуль для работы с HTML-шаблонами
aiopg==1.1.0 # модуль для асинхронной работой с базой Postgres
alembic==1.5.2 # модуль для генерации миграций
certifi==2020.12.5 # модуль, для работы с SSL-сертификатами
gino==1.0.1 # модуль для выполнения запросов базу данных
marshmallow==3.10.0 # модуль для работы с входными данными
PyYAML==5.4.1 # модуль для работы с yaml-файлами

Сохранив файл, откроем терминал и перейдем в нашу папку, чтобы скачать все необходимые зависимости:

cd /aiohttp_server
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

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

Первый запуск

Создадим в папке aiohttp_server следующую структуру:

├── app
│ ├── __init__.py
│ ├── forum
│ │ ├── __init__.py
│ │ ├── routes.py
│ │ └── views.py
│ ├── settings.py
├── main.py
├── requirements.txt
└── templates
└── index.html

Теперь откроем файл main.py и добавим в него следующее:

from aiohttp import web # основной модуль aiohttp
import jinja2 # шаблонизатор jinja2
import aiohttp_jinja2 # адаптация jinja2 к aiohttp

# в этой функции производится настройка url-путей для всего приложения
def setup_routes(application):
from app.forum.routes import setup_routes as setup_forum_routes
setup_forum_routes(application) # настраиваем url-пути приложения forum

def setup_external_libraries(application: web.Application) -> None:
# указываем шаблонизатору, что html-шаблоны надо искать в папке templates
aiohttp_jinja2.setup(application, loader=jinja2.FileSystemLoader("templates"))

def setup_app(application):
# настройка всего приложения состоит из:
setup_external_libraries(application) # настройки внешних библиотек, например шаблонизатора
setup_routes(application) # настройки роутера приложения

app = web.Application() # создаем наш веб-сервер

if __name__ == "__main__": # эта строчка указывает, что данный файл можно запустить как скрипт
setup_app(app) # настраиваем приложение
web.run_app(app) # запускаем приложение

Зайдем в файл views.py в папке app/forum и напишем:

import aiohttp_jinja2
from aiohttp import web
# создаем функцию, которая будет отдавать html-файл
@aiohttp_jinja2.template("index.html")
async def index(request):
return

Только что мы создали функциональный View. Определение “функциональный” означает, что код оформлен в виде функции, а не в виде класса (в следующей части мы коснемся и class-based View).

Рассмотрим написанную функцию более детально.

Функция обернута в декоратор @aiohttp_jinja2.template(«index.html») — этот декоратор передает возвращенное функцией значение в шаблонизатор Jinja2, а затем возвращает сгенерированную шаблонизатором html-страницу как http-ответ. В данном случае возвращенным значением является словарь, значения которого подставляются в html-файл index.html .

Отдельно стоит заметить, что объект запроса request передается как аргумент функции index . Мы не используем request в этой функции, но будем использовать в дальнейшем.

View — это некий вызываемый объект, который принимает на вход объект HTTP-запроса — Request и возвращает на пришедший запрос HTTP-ответ — Response.

Http-запрос содержит полезную информацию, например url, на который пришел запрос, данные, которые передал пользователь, а также контекст запроса. В контексте запроса содержатся данные, которые мы или aiohttp добавили к этому запросу. Например, мы предварительно авторизовали пользователя — чтобы повторно не проверять авторизацию пользователя из базы во всех View и не дублировать код, мы можем добавить объект пользователя в контекст запроса. Тогда мы сможем получить нашего пользователя во View примерно таким образом request[‘user’] , использовав хранилище запроса.

HTTP-ответ включает в себя полезную нагрузку, например json-данные, заголовки и статус ответа. В простейшем View, который мы только что написали, всю работу по формированию Http-ответа выполняет декоратор @aiohttp_jinja2.template(«index.html») . Он получает данные из нашего View, которые мы возвращаем в виде словаря, находит шаблон index.html (о шаблонах написано ниже), подставляет туда данные из этого словаря, преобразует шаблон в html-текст и передает его в ответ на запрос. Браузер воспринимает html и показывает страницу с нашим контентом.

В файл routes.py необходимо добавить следующий код:

from app.forum import views# настраиваем пути, которые будут вести к нашей странице
def setup_routes(app):
app.router.add_get("/", views.index)

Route — это звено, связывающее адрес, по которому был отправлен запрос и код View, в котором этот запрос будет обработан. То есть если пользователь перейдет на корень нашего сайта (по адресу /), то объект запроса будет передан в View index и оттуда же будет возвращен ответ. Подробней про Route можно прочитать тут.

Осталось только добавить в templates/index.html код для визуального представления нашей страницы, его можно найти по этой ссылке.

Template — это некий html-код, в который можно подставить данные, полученные в результате обработки запроса. В данном случае, в коде View мы отдаем словарь с ключом title, фрейморк Jinja2 ищет в указанном html-шаблоне строки > и заменяет их на значение из словаря по данному ключу. Это простейший пример, шаблоны позволяют делать намного больше: выполнять операции ветвления, циклы, а также множество встроенных функций, например простейшее суммирование. Примеры использования можно посмотреть в документации jinja2.

Мы создали первую версию нашего приложения! Осталось запустить его следующей командой в терминале (убедитесь, что находитесь в папке aiohttp_server):

python3 main.py

Вы должны увидеть следующий текст:

======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)

Давайте теперь наконец-то посмотрим результаты нашей работы, для этого в браузере напишем в адресной строке http://0.0.0.0:8080 и нажмем Enter. Вы должны увидеть первую версию нашего приложения. При клике на кнопку “Отправить” должно возникнуть сообщение о том, что отзыв отправлен.

Поздравляю! Вы успешно создали первое приложение на aiohttp!

Резюме

Подведем итоги этой статьи:

  • Настроили виртуальное python-окружение
  • Создали базовую структуру проекта
  • Написали первый View
  • Поработали с Jinja2-шаблонами
  • Провели первый запуск приложения

В следующей статье мы рассмотрим работу с базой данных и узнаем что такое миграции и как с ними удобнее работать в проектах с aiohttp.

Код для первой части статьи находится в этом репозитории.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *