[Разработка веб-сайтов, Python] Первые шаги в aiohttp
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
ВведениеПривет, меня зовут Артём и я работаю бекендером в KTS. Компания уже 3 года проводит летние и зимние курсы по разработке, а в феврале этого года прошла очередная бесплатная backend-школа от KTS. В ее рамках студенты изучали инструменты и технологии, которые используют разработчики нашей компании, общались с менторами и делали итоговый проект - чат-бота в стиле “Моя игра”, который защищали в конце курса. После курса отличившихся студентов мы приглашали на стажировку.Школа состояла из 6 лекций, шаг за шагом погружавших студентов в мир веб-разработки. На них были рассмотрены такие темы как сетевые протоколы, взаимодействие backend-а и frontend-а, компоненты веб-сервера и многое другое. Лейтмотивом курса было изучение асинхронного веб-программирования на Python, в частности изучение фреймворка aiohttp.Для поступления на курс нужно было пройти комплексный тест на знания в области веба и python-а, так что студенты пришли учиться с хорошим начальным уровнем знаний. Однако, во время курса выяснилось, что не все темы даются одинаково легко. Самыми трудными для понимания темами стали:
- Асинхронное программирование
- Работа с СУБД
- Деплой приложения
Студенты задавали достаточно разные по уровню понимания вопросы, начиная от “Как создать отложенную задачу, используя только asyncio?” и заканчивая “Почему нельзя использовать Django для асинхронного программирования?” (имелась в виду полностью синхронная версия Django). В коде наши менторы тоже находили ошибки, связанные с недостаточным пониманием предмета, например, использование синхронного драйвера для базы данных в асинхронном проекте.По результатам курса, я решил написать небольшой туториал, рассказывающий о создании базового aiohttp-сервиса с нуля и затрагивающий самые сложные для студентов вопросы: как сделать асинхронное python-приложение, как работать с базой данных и как разложить свой проект в интернете. В цикле статей мы рассмотрим следующие темы:
- Архитектура веб-приложения
- Асинхронная работа с базой данных и автоматические миграции
- Работа с HTML-шаблонами с помощью Jinja2
- Размещение нашего приложения в Интернете с помощью сервиса Heroku
- А также сигналы, обработку ошибок, работу с Docker’ом и многое другое.
Эта статья – первая из трех, и ее цель – помочь начинающим aiohttp-программистам написать первое “hello-world” приложение.В этой статье мы напишем небольшое веб-приложение на aiohttp — стену с отзывами, где пользователь может оставить мнение о продукте.
Мы пройдем по шагам:
Создание проектаВсе команды в статье были выполнены в операционной системе 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.Первый ViewView — это некий вызываемый объект, который принимает на вход 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
from aiohttp import web
# создаем функцию, которая будет отдавать html-файл
@aiohttp_jinja2.template("index.html")
async def index(request):
return {'title': 'Пишем первое приложение на aiohttp'}
Здесь создается функциональный 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.Первый RouteRoute — это звено, связывающее адрес, по которому был отправлен запрос и код 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-шаблоне строки {{title}} и заменяет их на значение из словаря по данному ключу. Это простейший пример, шаблоны позволяют делать намного больше: выполнять операции ветвления, циклы и другие операции, например, суммирование. Примеры использования можно посмотреть в документации 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 и опубликовать его в Интернете.Весь код статьи можно найти на гитхабе.Пользуясь случаем, приглашаю всех читателей, интересующихся веб-разработкой, к нам на бесплатные занятия школу KTS. А для более опытных читателей сейчас идет запись на продвинутые курсы для backend-разработчиков, желающих повысить свои навыки в асинхронной веб-разработке. Всю информацию о всех школах можно найти на сайте, а также в нашем телеграм-чате.
===========
Источник:
habr.com
===========
Похожие новости:
- [Python, Алгоритмы, Искусственный интеллект] Анализ результатов работы архитектуры YoloV3 на медицинских снимках (перевод)
- [Информационная безопасность, Python, Программирование, Алгоритмы] Реализация алгоритмов хеширования семейства SHA-2
- [Python] Сокрытые драгоценности Python (перевод)
- [Ruby, Python, Программирование, Будущее здесь] Почему за интерпретируемыми языками будущее
- [Open source, Python, Алгоритмы, Машинное обучение, Искусственный интеллект] Прогнозирование временных рядов с помощью AutoML
- [Разработка веб-сайтов, TypeScript, Лайфхаки для гиков] Карманная книга по TypeScript. Часть 2. Типы на каждый день (перевод)
- [Занимательные задачки, Python, Алгоритмы, Математика] В аквариуме: вычислительная генетика на Python и Mathcad (часть 1)
- [Разработка веб-сайтов, Python, JavaScript, Программирование] Как создавать предметы генеративного искусства с помощью L-систем на языке Python (перевод)
- [Разработка веб-сайтов, TypeScript, Лайфхаки для гиков] Карманная книга по TypeScript. Часть 1. Основы (перевод)
- [Python, Алгоритмы, Big Data, Машинное обучение, Искусственный интеллект] DataScience Digest — 28.05.21
Теги для поиска: #_razrabotka_vebsajtov (Разработка веб-сайтов), #_python, #_python3, #_asyncio, #_aiohttp, #_jinja, #_blog_kompanii_kts (
Блог компании KTS
), #_razrabotka_vebsajtov (
Разработка веб-сайтов
), #_python
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:24
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
ВведениеПривет, меня зовут Артём и я работаю бекендером в KTS. Компания уже 3 года проводит летние и зимние курсы по разработке, а в феврале этого года прошла очередная бесплатная backend-школа от KTS. В ее рамках студенты изучали инструменты и технологии, которые используют разработчики нашей компании, общались с менторами и делали итоговый проект - чат-бота в стиле “Моя игра”, который защищали в конце курса. После курса отличившихся студентов мы приглашали на стажировку.Школа состояла из 6 лекций, шаг за шагом погружавших студентов в мир веб-разработки. На них были рассмотрены такие темы как сетевые протоколы, взаимодействие backend-а и frontend-а, компоненты веб-сервера и многое другое. Лейтмотивом курса было изучение асинхронного веб-программирования на Python, в частности изучение фреймворка aiohttp.Для поступления на курс нужно было пройти комплексный тест на знания в области веба и python-а, так что студенты пришли учиться с хорошим начальным уровнем знаний. Однако, во время курса выяснилось, что не все темы даются одинаково легко. Самыми трудными для понимания темами стали:
Мы пройдем по шагам: Создание проектаВсе команды в статье были выполнены в операционной системе 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 pip install -r requirements.txt
├── app
│ ├── __init__.py │ ├── forum │ │ ├── __init__.py │ │ ├── routes.py # тут будут пути, по которым надо отправлять запросы │ │ └── views.py # тут будут функции, обрабатывающие запросы │ ├── settings.py ├── main.py # тут будет точка входа в приложение ├── requirements.txt └── templates └── index.html # тут будет html-шаблон страницым сайта 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) # запускаем приложение import aiohttp_jinja2
from aiohttp import web # создаем функцию, которая будет отдавать html-файл @aiohttp_jinja2.template("index.html") async def index(request): return {'title': 'Пишем первое приложение на aiohttp'} from app.forum import views
# настраиваем пути, которые будут вести к нашей странице def setup_routes(app): app.router.add_get("/", views.index) python3 main.py
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit) Поздравляю! Вы успешно создали первое приложение на aiohttp!ЗаключениеВ статье рассмотрено создание простого приложения на aiohttp, которое принимает запрос пользователя и отдает html-страницу. Мы затронули:
=========== Источник: habr.com =========== Похожие новости:
Блог компании KTS ), #_razrabotka_vebsajtov ( Разработка веб-сайтов ), #_python |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:24
Часовой пояс: UTC + 5