![](https://habrastorage.org/getpro/habr/upload_files/716/0c0/79c/7160c079c50a99014fe3a6fa6cf0daf4.png)
Меня зовут Андрей Устьянцев, я ведущий аналитик направления Big Data Лиги Цифровой Экономики. Этот текст — техническое продолжение ранее написанных мной материалов:
Пишем чат-бот для Telegram на Python, используя webhook и минимум внешних библиотек;
Получаем данные из «Яндекс.Метрики» в электронные таблицы и BI: пошаговая инструкция.
В них я рассказал, что для создания сервиса доступа к данным или Webhook для Telegram-бота можно использовать сайт на виртуальном хостинге.
На примере виртуального хостинга провайдера Netangels покажу, как я делаю это для своих проектов, в том числе описанных в перечисленных выше материалах.
Создаем сайт
В личном кабинете переходим в раздел «Хостинг», нажимаем кнопку «Создать контейнер».
![](https://habrastorage.org/getpro/habr/upload_files/775/5c1/04d/7755c104de184fb8ecf834b5db3e25d4.png)
Вводим понятное для себя название контейнера или оставляем как есть и нажимаем кнопку «Продолжить».
Примечание: я в своих проектах использую один контейнер, внутри которого создаю сайты на технических доменах для всех своих проектов. То есть все сайты — в одном контейнере.
![](https://habrastorage.org/getpro/habr/upload_files/f42/525/6c5/f425256c52aa599dfb5fbcf99e083320.png)
После создания контейнера вы попадете в раздел создания сайтов. Если этого не произошло, перейдите в раздел «Хостинг», далее нажмите кнопку «Создать первый сайт».
![](https://habrastorage.org/getpro/habr/upload_files/2d1/f74/9c3/2d1f749c3e7ca5acd745237830c692c4.png)
Когда вы создадите первый сайт, интерфейс несколько изменится. В правой части будут отображаться все созданные вами сайты. Для создания нового надо будет нажать на кнопку «Добавить сайт».
![](https://habrastorage.org/getpro/habr/upload_files/dd1/4f3/9ef/dd14f39efeff899bda605e5bda49c696.png)
Далее в окне создания нового сайта выберите «Использовать тестовый домен».
![](https://habrastorage.org/getpro/habr/upload_files/2e2/673/b04/2e2673b0416af7154aa75e6323429c1c.png)
Если у вас есть свой домен, который вы хотите использовать для выполнения задач, в поле «Имя сайта» введите название этого домена. При этом NS-записи для этого домена у регистратора должны быть настроены на сервера виртуального хостинга! Подробно расписывать не буду, поскольку это тема, выходящая за рамки материала.
Дальнейшие действия должны быть такими:
В поле «Имя сайта» вводим латинскими буквами без пробелов и других спецсимволов, собственно, название вашего сайта.
Примечание: этот сайт будет размещаться на домене третьего уровня с именем «Имя сайта» (articletest в примере на картинке ниже) на техническом домене хостинг-провайдера (замазан на картинке на всякий случай. Для сохранения смысла статьи пусть это будет в терминах статьи techdomen.ru). Так, ваш сайт будет иметь адрес вида articletest.techdomen.ru
Выбираем «Язык сайта» — Python.
Выбираем базу данных для сайта — PostgreSQL.
Примечание: вы можете использовать и mySQL, и MongoDB. Я выбираю PostgreSQL, т.к. мне удобно работать с собранными в базу данных внешними SQL-редакторами (подробнее о работе с базой данных — в конце статьи в соответствующем разделе).
-
Жмем на кнопку «Создать сайт».
Настоятельно рекомендую сразу выпустить бесплатный SSL-сертификат — просто нажмите кнопку «Подключить бесплатно» (1 на картинке ниже) и затем кнопку «Подключить» (2 на картинке) в окне подтверждения.
![](https://habrastorage.org/getpro/habr/upload_files/064/e04/fc7/064e04fc764abb802bd2cb7727d4d302.png)
SSL-сертификат выпускается достаточно быстро. Подтверждение успешного выпуска сертификата придет в виде почтового сообщения на адрес электронной почты, который вы указывали при регистрации.
Рекомендую обратить внимание на опцию, обозначенную цифрой 3 на картинке выше. При нажатии на значок вопроса в кружке рядом с опцией появится дополнительная информация, что именно это обозначает. Хотя, по моему мнению, и так понятно.
Размещаем Python-код
Нажимаем на кнопку меню «Файловый менеджер».
![](https://habrastorage.org/getpro/habr/upload_files/f89/76f/6fb/f8976f6fbd235dbae6b42f0d2d0545b4.png)
Переходим в папку app двойным кликом мышью на ней.
![](https://habrastorage.org/getpro/habr/upload_files/52d/4f4/eb8/52d4f4eb8fa517e895fdeccbd6823ec3.png)
Открываем на редактирование файл wsgi.py кликом правой кнопкой мыши на этом файле, из выпадающего меню выбираем «Правка».
![](https://habrastorage.org/getpro/habr/upload_files/e86/eb2/c71/e86eb2c716233f1242ffa0140e3365bf.png)
Важно! Это основной файл приложения на Python, который вызывается (исполняется) при обращении к вашему сайту. Не меняйте его название и не переносите в другой каталог.
Уточню, что также имеется возможность загружать файлы через браузер (опция «Загрузить файлы» в панели инструментов файлового менеджера) или через FTP-клиента — подробно на этом останавливаться не буду, чтобы не отвлекаться от основной канвы повествования.
Рассмотрим подробнее содержание этого файла. При создании сайта в этом файле уже размещен минимальный код на Python, который просто отображает содержимое html-страницы. В теле функции application и необходимо размещать свой Python-код.
Важно! Не меняйте названия и определения функции application(env, start_response), это основная функция приложения.
Примеры кодов, как я это делаю в своих проектах, можно посмотреть в статьях, которые я упоминал ранее:
Чтобы ничего случайно не сломать, я обычно пишу код в онлайн-редакторе с нуля или переношу простым копипастом из Jupyter-ноутбука. Для сохранения выберите в меню онлайн-редактора пункт «Файл», затем — «Сохранить».
Проверяем работоспособность кода
После сохранения файла wsgi.py возвращаемся на вкладку личного кабинета. Переходим в раздел Python и нажимаем «Перезапустить Python».
![](https://habrastorage.org/getpro/habr/upload_files/31f/45b/0fb/31f45b0fba16c4643e9ca79cc0d3e583.png)
Важно! Дождитесь появления сообщения в правом верхнем углу экрана об успешности перезапуска Python-приложения и не забывайте это делать при каждом изменении Python-кода, иначе внесенные изменения не вступят в силу.
![](https://habrastorage.org/getpro/habr/upload_files/6ef/53f/c0a/6ef53fc0a4cfa8a3d79629f222759679.png)
После этого можно открыть в браузере сайт по вашему адресу, который указывали при создании сайта, или просто обновить вкладку, если ранее был открыт.
Второй вариант — нажать на значок рядом с адресом сайта в панели управления.
![](https://habrastorage.org/getpro/habr/upload_files/a75/180/0d8/a751800d84c856aab9abd8bd9922365e.png)
При успешном выполнении Python-кода что-то да появится на экране (подробности — ниже).
![](https://habrastorage.org/getpro/habr/upload_files/580/b96/995/580b969954350988fd6cb87bf71ebd95.png)
При возникновении ошибки на экране может ничего не отобразиться. Или хуже — все может «упасть» с ошибкой 500. Без паники — идем в файловый менеджер в папку /log/wsgi-runlog, открываем на просмотр файл current (только не щелкайте по нему два раза мышью, лучше — правой кнопкой, потом выберите «Просмотр»). В этом файле в подробностях сохраняются все ошибки даже с указанием номера строки, в которой они возникли.
![](https://habrastorage.org/getpro/habr/upload_files/f11/ac4/ed8/f11ac4ed838b1614a1db08339b50c257.png)
Основная функция приложения 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')]
Результат исполнения кода будет выглядеть примерно так:
![](https://habrastorage.org/getpro/habr/upload_files/f52/2f9/ddd/f522f9ddd3774d3398e4982802a7bf7b.png)
Какие переменные важны в первую очередь?
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-библиотек
В панели управления сайтом заходим в раздел «Файлы», выбираем «Терминал».
![](https://habrastorage.org/getpro/habr/upload_files/50a/c6c/e52/50ac6ce52579058c4421ad4fa266947d.png)
В новой вкладке браузера откроется окно терминала, где можно вводить команды pip install.
![](https://habrastorage.org/getpro/habr/upload_files/15f/2d4/627/15f2d462706a2418c27abcab73d8c5cd.png)
Запуск Python-кода по расписанию (Cron)
Если вам необходимо запускать код с определенной периодичностью, используйте функциональность виртуального хостинга Cron.
Рекомендую сначала определить имя страницы, по которой будет вызываться код по расписанию. Для примера пусть это будет cron. Дописываем код функции application: указываем условие if env['PATH_INFO'] == '/cron' и Python-код, который будет запускаться по расписанию (либо сразу в условии if, либо вызовом отдельной функции — на ваше усмотрение).
Далее переходим в личный кабинет сайта в раздел cron и нажимаем кнопку «Добавить задание».
![](https://habrastorage.org/getpro/habr/upload_files/fa1/bb8/2ad/fa1bb82ad6746d4177f1151403f401c0.png)
Настраиваем параметры запуска:
Нажимаем на HTTPS.
В поле «Команда» дописываем название страницы, с которой решили связать Python-код для запуска по расписанию (в нашем примере cron).
Настраиваем расписание периодичности запуска.
Поле «Комментарий» заполнять не обязательно, это больше справочная информация для вас.
-
Жмем кнопку «Создать задание».
Если вы владеете нотацией формирования расписаний cron, можете выбрать вкладку «Задать вручную» и в текстовом поле самостоятельно сформировать строку задания.
Важно! Python-код, который запускается по расписанию, будет исполняться на стороне сервера. Соответственно, никаких выводов на экран быть не может. Если вам необходимо сохранить какую-то информацию, пишите в текстовый файл, а потом просматривайте в файловом менеджере.
Работа с базой данных Postrge
Как писал выше, в своих проектах я использую базу данных PostgreSQL.
При создании сайта будет сгенерирована база данных Postgre, с которой можно работать в Python-коде. Все параметры подключения находятся на вкладке PostgreSQL.
![](https://habrastorage.org/getpro/habr/upload_files/339/feb/6a3/339feb6a35903043b35070f55907d9cf.png)
Работать с базой данных (создавать таблицы, просматривать, редактировать) можно в браузере с использованием pgAdmin. А можно подключиться внешним SQL-редактором (например, Dbeaver) и работать с базой данных из него. В разделе «Технических статей» во внутренней базе знаний есть написанная мною пошаговая инструкция, как это сделать.
Заключение
Надеюсь, моя инструкция оказалась для вас полезна, и теперь вы сможете использовать виртуальный хостинг с Python в качестве API-шлюза (сервиса доступа к данным) или для Webhook — намного быстрее.