Меня зовут Андрей Устьянцев, я ведущий аналитик направления Big Data Лиги Цифровой Экономики. Этот текст — техническое продолжение ранее написанных мной материалов:
Пишем чат-бот для Telegram на Python, используя webhook и минимум внешних библиотек;
Получаем данные из «Яндекс.Метрики» в электронные таблицы и BI: пошаговая инструкция.
В них я рассказал, что для создания сервиса доступа к данным или Webhook для Telegram-бота можно использовать сайт на виртуальном хостинге.
На примере виртуального хостинга провайдера Netangels покажу, как я делаю это для своих проектов, в том числе описанных в перечисленных выше материалах.
Создаем сайт
В личном кабинете переходим в раздел «Хостинг», нажимаем кнопку «Создать контейнер».
Вводим понятное для себя название контейнера или оставляем как есть и нажимаем кнопку «Продолжить».
Примечание: я в своих проектах использую один контейнер, внутри которого создаю сайты на технических доменах для всех своих проектов. То есть все сайты — в одном контейнере.
После создания контейнера вы попадете в разделе создания сайтов. Если этого не произошло, перейдите в раздел «Хостинг», далее нажмите кнопку «Создать первый сайт».
Когда вы создадите первый сайт, интерфейс несколько изменится. В правой части будут отображаться все созданные вами сайты. Для создания нового надо будет нажать на кнопку «Добавить сайт».
Далее в окне создания нового сайта выберите «Использовать тестовый домен».
Если у вас есть свой домен, который вы хотите использовать для выполнения задач, в поле «Имя сайта» введите название этого домена. При этом NS-записи для этого домена у регистратора должны быть настроены на сервера виртуального хостинга! Подробно расписывать не буду, поскольку это тема, выходящая за рамки материала.
Дальнейшие действия должны быть такими:
В поле «Имя сайта» вводим латинскими буквами без пробелов и других спецсимволов, собственно, название вашего сайта.
Примечание: этот сайт будет размещаться на домене третьего уровня с именем «Имя сайта» (articletest в примере на картинке ниже) на техническом домене хостинг-провайдера (замазан на картинке на всякий случай. Для сохранения смысла статьи пусть это будет в терминах статьи techdomen.ru). Так, ваш сайт будет иметь адрес вида articletest.techdomen.ru
Выбираем «Язык сайта» — Python.
Выбираем базу данных для сайта — PostgreSQL.
Примечание: вы можете использовать и mySQL, и MongoDB. Я выбираю PostgreSQL, т. к. мне удобно работать с собранными в базу данными внешними SQL-редакторами (подробнее о работе с базой данных — в конце статьи в соответствующем разделе).
Жмем на кнопку «Создать сайт».
Настоятельно рекомендую сразу выпустить бесплатный SSL-сертификат — просто нажмите кнопку «Подключить бесплатно» (1 на картинке ниже) и затем кнопку «Подключить» (2 на картинке) в окне подтверждения.
SSL-сертификат выпускается достаточно быстро. Подтверждение успешного выпуска сертификата придет в виде почтового сообщения на адрес электронной почты, который вы указывали при регистрации.
Рекомендую обратить внимание на опцию, обозначенную цифрой 3 на картинке выше. При нажатии на значок вопроса в кружке рядом с опцией появится дополнительная информация, что именно это обозначает. Хотя, по моему мнению, и так понятно.
Размещаем Python-код
Нажимаем на кнопку меню «Файловый менеджер».
Переходим в папку app двойным кликом мышью на ней.
Открываем на редактирование файл wsgi.py кликом правой кнопкой мыши на этом файле, из выпадающего меню выбираем «Правка».
Важно! Это основной файл приложения на Python, который вызывается (исполняется) при обращении к вашему сайту. Не меняйте его название и не переносите в другой каталог.
Уточню, что также имеется возможность загружать файлы через браузер (опция «Загрузить файлы» в панели инструментов файлового менеджера) или через FTP-клиента — подробно на этом останавливаться не буду, чтобы не отвлекаться от основной канвы повествования.
Рассмотрим подробнее содержание этого файла. При создании сайта в этом файле уже размещен минимальный код на Python, который просто отображает содержимое html-страницы. В теле функции application и необходимо размещать свой Python-код.
Важно! Не меняйте названия и определения функции application(env, start_response), это основная функция приложения.
Примеры кодов, как я это делаю в своих проектах, можно посмотреть в статьях, которые я упоминал ранее:
Пример кода для создания сервиса доступа к данным (по сути API-шлюз);
Пример кода Webhook для Telegram-бота.
Чтобы ничего случайно не сломать, я обычно пишу код в онлайн-редакторе с нуля или переношу простым копипастом из Jupyter-ноутбука. Для сохранения выберите в меню онлайн-редактора пункт «Файл», затем — «Сохранить».
Проверяем работоспособность кода
После сохранения файла wsgi.py возвращаемся на вкладку личного кабинета. Переходим в раздел Python и нажимаем «Перезапустить Python».
Важно! Дождитесь появления сообщения в правом верхнем углу экрана об успешности перезапуска Python-приложения и не забывайте это делать при каждом изменении Python-кода, иначе внесенные изменения не вступят в силу.
После этого можно открыть в браузере сайт по вашему адресу, который указывали при создании сайта, или просто обновить вкладку, если ранее был открыт.
Второй вариант — нажать на значок рядом с адресом сайта в панели управления.
При успешном выполнении Python-кода что-то да появится на экране (подробности — ниже).
При возникновении ошибки на экране может ничего не отобразиться. Или хуже — все может «упасть» с ошибкой 500. Без паники — идем в файловый менеджер в папку /log/wsgi-runlog, открываем на просмотр файл current (только не щелкайте по нему два раза мышью, лучше — правой кнопкой, потом выберите «Просмотр»). В этом файле в подробностях сохраняются все ошибки даже с указанием номера строки, в которой они возникли.
Основная функция приложения application — детали
Переменная env содержит все переменные окружения Web-сервера в виде словаря Python. Просмотреть список всех переменных окружения и переданных значений можно при помощи кода:
def application(env, start_response):
content=""
k=list(env.keys())
for key in k:
content=content+str(key)+" = "+str(env[key])+"<br>"
start_response('200 OK', [('Content-Type','text/html')])
return [content.encode('utf-8')]
Результат исполнения кода будет выглядеть примерно так:
Какие переменные важны в первую очередь?
QUERY_STRING — эта переменная окружения будет содержать параметры, которые передаются в адресной строке. Зачем они нужны, как их использовать и как распарсивать, подробно описано в статье в разделе «Сделаем код более универсальным».
REQUEST_METHOD — метод обращения к сайту (вызова ваших сервисов). Обычно имеет значение GET, но может принимать и другие значения (POST, PUT и т .д.)
REMOTE_ADDR — ip-адрес компьютера, который обратился к вашему сайту. Полезно, если необходимо фильтровать входящий трафик по своей логике.
wsgi.input — данные, передаваемые в формате WSGI. Редко, но встречающийся способ обмена данными, используется, например, серверами Telegram. Подробнее про особенности работы с данными в таком формате я рассказал в статье про написание чат-бота для Telegram.
REQUEST_URI — в этой переменной хранится имя страницы, к которой произошло обращение.
Это важная переменная окружения, и она вам точно пригодится. Сайты на Python устроены так, что какую бы страницу сайта вы ни указали в адресной строке браузера или при вызове сервиса обработки данных (API), типа site.techdomen.ru/abrakadabra, виртуальный хостинг все равно выполнит код в файле wsgi.py в функции application.
Чтобы при обращении к разным адресам выполнялся различный код, внутри функции application необходимо описать логику в зависимости от страницы, к которой обращались, например, так:
if env['PATH_INFO'] == '/page1':
# тут код для страницы (адреса) sitename.techdomen.ru/page1
elif env['PATH_INFO'] == '/page2':
# тут код для страницы (адреса) sitename.techdomen.ru/page2
else:
raise ValueError('Вызов неизвестного URL')
Пример, как это использовать и зачем, я описал в статье в разделе «Усовершенствуем сервис доступа к данным».
Вернемся к коду функции application:
def application(env, start_response):
content=""
k=list(env.keys())
for key in k:
content=content+str(key)+" = "+str(env[key])+"<br>"
start_response('200 OK', [('Content-Type','text/html')])
return [content.encode('utf-8')]
Если бы мы делали именно сайт на Python, в переменной content размещается html-код страницы, которую отобразит браузер. Инструкция return [content.encode('utf-8')] возвращает web-серверу html-код страницы для отображения в браузере.
Строку с вызовом start_response я никогда не изменяю. Ее назначение — сообщить, что ваш код выполнился успешно (код ответа 200).
Если коротко, то строки 9-10 в приведенном листинге я оставляю без изменения и использую как обязательные инструкции перед завершением исполнения функции application.
Подключение дополнительных Python-библиотек
В панели управления сайтом заходим в раздел «Файлы», выбираем «Терминал».
В новой вкладке браузера откроется окно терминала, где можно вводить команды pip install.
Запуск Python-кода по расписанию (Cron)
Если вам необходимо запускать код с определенной периодичностью, используйте функциональность виртуального хостинга Cron.
Рекомендую сначала определить имя страницы, по которой будет вызываться код по расписанию. Для примера пусть это будет cron. Дописываем код функции application: указываем условие if env['PATH_INFO'] == '/cron' и Python-код, который будет запускаться по расписанию (либо сразу в условии if, либо вызовом отдельной функции — на ваше усмотрение).
Далее переходим в личный кабинет сайта в раздел cron и нажимаем кнопку «Добавить задание».
Настраиваем параметры запуска:
Нажимаем на HTTPS.
В поле «Команда» дописываем название страницы, с которой решили связать Python-код для запуска по расписанию (в нашем примере cron).
Настраиваем расписание периодичности запуска.
Поле «Комментарий» заполнять не обязательно, это больше справочная информация для вас.
Жмем кнопку «Создать задание».
Если вы владеете нотацией формирования расписаний cron, можете выбрать вкладку «Задать вручную» и в текстовом поле самостоятельно сформировать строку задания.
Важно! Python-код, который запускается по расписанию, будет исполняться на стороне сервера. Соответственно, никаких выводов на экран быть не может. Если вам необходимо сохранить какую-то информацию, пишите в текстовый файл, а потом просматривайте в файловом менеджере.
Работа с базой данных Postrge
Как писал выше, в своих проектах я использую базу данных PostgreSQL.
При создании сайта будет сгенерирована база данных Postgre, с которой можно работать в Python-коде. Все параметры подключения находятся на вкладке PostgreSQL.
Работать с базой данных (создавать таблицы, просматривать, редактировать) можно в браузере с использованием pgAdmin. А можно подключиться внешним SQL-редактором (например, Dbeaver) и работать с базой данных из него. В разделе «Технических статей» во внутренней базе знаний есть написанная мною пошаговая инструкция, как это сделать.
Заключение
Надеюсь, моя инструкция оказалась для вас полезна, и теперь вы сможете использовать виртуальный хостинг с Python в качестве API-шлюза (сервиса доступа к данным) или для Webhook — намного быстрее.