Данный проект представляет собой web-сервис для анализа статей с новостных сайтов.
Схема работы сервиса:
* Сервис получает список ссылок на новостные статьи для анализа.
* Сервис скачивает веб-страницы и получает текст статей.
* Текст нормализуется.
* Оценивается доля экспрессивных (негативных или позитивных слов) и вычисляется рейтинг "желтушности" статьи.
Пока поддерживается только один новостной сайт - ИНОСМИ.РУ. Для него разработан специальный адаптер, умеющий выделять текст статьи на фоне остальной HTML разметки. Для других новостных сайтов потребуются новые адаптеры, все они будут находиться в каталоге adapters
. Туда же помещен код для сайта ИНОСМИ.РУ: adapters/inosmi_ru.py
.
В перспективе можно создать универсальный адаптер, подходящий для всех сайтов, но его разработка будет сложной и потребует дополнительных времени и сил.
Вам понадобится Python версии 3.7 или старше. Для установки пакетов рекомендуется использовать Poetry.
Первым шагом установите пакеты:
poetry install --no-dev
Если вы хотите запускать тесты, то нужно установить так-же и dev-зависимости
poetry install
Способо 1: Активировать виртуальное окружение командой poetry shell
и далее запускать команды.
Способ 2: Запускать каждую команду как poetry run команда, которую хотите запустить
.
Для запуска используйте команду
python server.py
Вы можете передавать параметры чата как переменные окружения или как параметры командной строки.
Параметры командной строки имеют более высокий приоритет.
Переменная окружения | Параметр командной строки | Значение по-умолчанию | Описание |
---|---|---|---|
NEWS_PORT | --port | 8080 | На каком порту будет работать сервер |
NEWS_REQUEST_TIMEOUT | --request_timeout | 2 | Максимальное время ожидания загрузки страницы с новостью, сек. |
NEWS_PROCESS_TIMEOUT | --process_timeout | 3 | Максимальное время обработки текста статьи, сек. |
NEWS_URL_LIMIT | --urls_limit | 10 | Максимальное количество адресов url в одном запросе |
NEWS_REDIS_HOST | --redis_host | None | Адрес сервера Redis для кеширования |
NEWS_REDIS_PORT | --redis_port | 6379 | Порт сервера Redis |
Для ускорения работы сервиса может использоваться Redis. Если при запуске указаны параметры подключения, то все результаты всех успешных запросов на анализ статей будут закэшированы на 1 час и все запросы на анализ точно такого-же урла будут возвращаться из кэша, ускоряя работу.
Для тестирования используется pytest. Команда для запуска тестов:
python -m pytest
Проект содержит два docker-compose файла, для разработки и для продакшена.
Для сборки контейнеров используйте команду
docker-compose -f docker-compose-dev.yml build
При сборке в dev
режиме внутри контейнера будут установлены все зависимости проекта (в том числе и dev, для запуска тестов и т.п.)
Файлы проекта не будут скопированы внутрь контейнера, поэтому запустить его можно будет только примонтировав директорию проекта внутрь контейнера
(это сделано целенаправленно, чтобы этот контейнер сразу падал, если использовать его не по-назначению).
В docker-compose-dev.yml
монтирование уже настроено, плюс открываются порты и для aiohttp-сервера и для redis-сервера для возможности
более простого подключения к ним и отладки.
Так как директория проекта смонтирована внутрь образа, при изменении исходников нужно только перезапустить проект, без пересборки образов (если не добавлялись новые пакеты, естественно).
PyCharm позволяет даже запускать и подключаться дебагером к проекту, запущенному в docker контейнере.
Запуск проекта
docker-compose -f docker-compose-dev.yml up
Для запуска отдельной команды следует использовать docker-compose run
вместе с флагом --rm
чтобы автоматически удалить версию контейнера после.
Например docker-compose -f docker-compose-dev.yml run --rm web python -m pytest
(web - имя сервиса в docker-compose файле)
Если проект уже запущен, то можно воспользоваться командой exec
(например зайти в сеанс bash внутри контейнера с aiohttp сервером)
docker-compose -f docker-compose-dev.yml exec web bash
Сборка образов и запуск проекта из этого файла отличается следующими особенностями:
- В итоговый образ НЕ устанавливаются зависимости из dev раздела pyproject.toml
- В итоговый образ копируется содержимое директории проекта, образ можно переносить на другие машины и он будет работать.
- Наружу открыт только порт nginx-a. Зайти на порт aiohttp сервера и redis-сервера снаружи нельзя.
Сборка и запуск
docker-compose -f docker-compose-prod.yml build
docker-compose -f docker-compose-prod.yml up -d
Код написан в учебных целях. Это урок из курса по веб-разработке — Девман.