Waitress молодой легкий WSGI-сервер на чистом Python производственного качества с очень приемлемой производительностью. Не похож своим стилем работы на другие WSGI серверы. Его легко установить, он не требует дополнительных зависимостей, кроме тех, которые находятся в стандартной библиотеке Python.
Waitress использует комбинацию асинхронного и синхронного кода для выполнения своей работы и обслуживает запросы через потоки. Работает в Unix и Windows под управлением Python 3.7+ и поддерживает протоколы HTTP/1.0 и HTTP/1.1. Официальная документация и настройки безопасности сервера находятся по адресу Waitress documentation ↗
После окончания тестирования сайта Django в Visual Studio, можно приступать к его развертыванию на сервере по такому сценарию: проверка и отладка работы на локальном сервере, настройка и тестирование на безопасность, и окончательный шаг, копирование отлаженных файлов на внешний хостинг. На собственном компьютере можно безопасно отладить и проверить реальную работу веб-приложения в производственном режиме, в условиях максимально приближенных к условиям внешнего хоста.
Примечание. Пример взаимодействия веб-приложения Django и Waitress версии 2 описанный в данной статье предназначен для создания быстрых сайтов, не требующих аутентификации. Сервер Waitress не самый навороченный из доступных серверов WSGI и пока не поддерживает работу по протоколу HTTPS. Для работы Django-Waitress с HTTPS требуется несколько иное взаимодействие с IIS, которое будет описано позже. В пользу данного примера можно добавить, что скорость работы сайтов не требующих https-соединений выше, чем сайтов, работающих по HTTPS.
Данная статья пошагово-подробно описывает развертывание и совместную работу производственного сервера Waitress версии 2 и веб-приложения Django в операционной системе Windows. Сервер Waitress будет работать в паре со службами IIS. Прилагается исходный код проекта Django для Visual Studio, используя данный исходник можно быстро начать тестирование веб-приложения Python на сервере IIS операционной системы Windows.
Первичный запуск сервера Waitress в Windows будет осуществлять службы IIS, причем это будет происходить автоматически. При первом клиентском запросе создается рабочий процесс IIS (в диспетчере задач он под названием IIS Worker Process) и запускаются два интерпретатора Python: один базовый, который имеет основные библиотеки, второй - интерпретатор виртуальной среды. Последний запускает Waitress со связанным WSGI приложением. Waitress начинает прослушивать HTTP-запросы посредством служб IIS на разрешенном имени хоста.
Далее Waitress непрерывно получает клиентские запросы и отправляет ответы клиентам посредством служб IIS. Данная интернет работа длится безостановочно и в случае сбоя работы или перезагрузки самого сервера IIS, очередной запрос клиента вновь восстанавливает вышеописанную цепочку. Таким образом обеспечивается надежная работа сервера WSGI Waitress в паре с веб-приложением Python.
Если вы используете прикрепленный ниже исходник, обращайте внимание на версию интерпретатора для создания виртуальной среды: для данного исходника требуется версия Python в рамках 3.8 – 3.9. В случае каких-либо ошибок при установке виртуальной среды ее папку можно удалить и повторить установку, локальность - одно из главных достоинств виртуальных сред Python.
Программный пакет сервера Waitress можно устанавливать как работая в IDE Visual Studio, так и непосредственно на локальном хосте компьютера с помощью сервиса командной строки. Для установки Waitress в виртуальную среду локального хоста требуются последовательные шаги:
1. Вызов командной строки из папки хоста (например, напечатать cmd в адресной строке Windows проводника и нажать Enter).
2. Активация виртуальной среды командой: env\scripts\activate
3. Команда установки пакета Waitress: pip install waitress==2.1.2
Прикрепленный исходник содержит версию Waitress 2.1.2, без указания версии установится последняя стабильная. В составе виртуальной среды должен быть установщик пакетов pip. После выполнения этих команд установится пакет сервера Waitress в виртуальную среду для веб-проекта Django.
Итак, файлы публикации на хост загружены, виртуальная среда восстановлена, пакет Waitress установлен – все готово для запуска сайта. Настройки работы служб IIS с сервером WSGI Waitress определим в специальном файле web.config, в котором укажем параметры запуска веб-приложения Python. Web.config – обязательный XML файл настройки сервера IIS, очень похожий по функциональности на .htaccess сервера Apache. Данный файл необходимо разместить в корневой папке хоста.
Приложение Django и сервер Waitress будут работать посредством встроенного в IIS модуля ASP.NET Core (ANCM). ANCM — это собственный модуль IIS, который подключается к конвейеру IIS, чтобы веб-приложения могли работать со службами IIS. Именно модуль ANCM, при поступлении первого запроса, запускает отдельный процесс IIS (IIS Worker Process) и тандем Waitress-Django, а также перезапускает их при сбое или завершении работы. В нашем случае модуль ANCM будет запускать WSGI-пару Waitress-Django на случайном свободном номере порта, который сохраняется в ASPNETCORE_PORT.
ASPNETCORE_PORT – переменная среды IIS для получения веб-приложениями номера порта запуска. В файл manage.py проекта Django необходимо добавить строки получения номера порта из переменной ASPNETCORE_PORT и несколько изменить код исполнения команд:
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
import waitress
from mydjango.wsgi import application
# Получаем номер порта из переменной среды IIS.
# 5000 – это номер порта в случае сбоя получения.
PORT = os.getenv("ASPNETCORE_PORT", "5000")
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
# Такое разветвление разделяет поток команд:
# команда runwaitress запускает сервер Waitress и веб-приложение,
# стандартные команды передаются фреймворку Django.
if len(sys.argv) > 1 and sys.argv[1] == "runwaitress" :
waitress.serve(application, port=PORT, host="*")
else:
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
В функции waitress.serve(application, port=PORT, host="*") имя хоста указано звездочкой *, но при размещении на внешнем хосте, в целях безопасности, необходимо указывать название домена или IP-адрес (если сайт хостится на выделенном IP), например: waitress.serve(application, port=PORT, host="example.com")
Ниже XML код корневого web.config для функционирования сайта фреймворка Django на сервере IIS с включенными log файлами для записей событий работы сервера:
Модуль ANCM будет запускать интерпретатор виртуальной среды проекта Django с аргументами manage.py runwaitress. Название аргумента runwaitress — это собственное произвольное и можно определить любое желаемое.
После создания корневого web.config и корректировки утилиты командной строки Django manage.py сайт успешно запустится. Как видно на скриншоте выше сайт запустился, но без декоративных стилей. Дело в том, что сервер Waitress не предназначен для обслуживания статических файлов. Да и в этом нет необходимости, Waitress будет работать с «легким» html контентом, а со статическими файлами легко справится мощный сервер IIS.
Для задействования статических файлов приложений проекта Django соберем всю статику в отдельную папку, название которой указано в модуле settings.py настроек проекта, в константе STATIC_ROOT. Фреймворк Django имеет некоторые особенности работы со статическими файлами, для ознакомления с которыми которых можно обратиться к странице Django и статические файлы данного сайта.
Для сбора статических файлов применяется команда: manage.py collectstatic набранную в командной строке, вызванной в корневой папке проекта Django, команду следует выполнять при активированной виртуальной среде проекта.
Сбор статических файлов проекта Django
После процедуры сбора в корневой папке появится каталог со статическими файлами проекта, в прикрепленном исходнике определено название каталога static. Теперь разрешим серверу IIS обрабатывать статические файлы в данном каталоге и для этого создадим в нем локальный web.config, код которого ниже.
Теперь сайт будет выглядеть значительно привлекательней. И если с помощью инструментов разработчика браузера проверить заголовки, то можно удостовериться, что html файлы обрабатывает сервер Waitress, а файлы css, js, images обслуживает сервер IIS. Работа Waitress значительно облегчается, т. к. основную нагрузку от запросов статических файлов на себя берет производительный и мощный IIS. Кроме того, директива <urlCompression doStaticCompression="true" /> дает команду серверу IIS уменьшать размеры методом сжатия GZip отправляемое браузеру статическое содержимое.
Для экономии трафика и увеличения скорости загрузки веб-страниц в модуле settings.py проекта Django очень желательно добавить промежуточное программное обеспечение django.middleware.gzip.GZipMiddleware для сжатии html содержимого. Как рекомендуют разработчики Django: это промежуточное программное обеспечение должно быть размещено перед любым другим промежуточным программным обеспечением, которое читает или записывает тело ответа.
И самое главное, перед размещением контента сайта на внешнем хостинге необходимо проверить настройки безопасности сайта. Для облегчения проверки сайта на безопасность разработчики Django предусмотрели специальную команду: manage.py check --deploy это программная утилита проверки готовности сайта к развертыванию. Данную команду запускают командной строкой из корневой папки хоста при активированной виртуальной среде. Для максимальной безопасности все предупреждения должны быть устранены. Первоисточник о настройках безопасности находится в актуальной документации Django ↗.
Прикрепленный исходник содержит опубликованный сайт Django для работы с производственным сервером Waitress на платформе Windows IIS. Исходник не включает виртуальную среду, которая создается самостоятельно по описанию в данной статье.
Для функционирования сайта необходимо использовать интерпретатор Python версий 3.8 – 3.9. Для сайта используется база MySQL, необходимый файл sql для создания базы включен. Имя для базы MySQL shop_electronics, но вы можете изменить эти настройки в модуле settings.py, в константе DATABASES.