Waitress Django IIS

Все исходники / Язык программирования Python / OS Windows / Веб программирование / Django - веб-фреймворк на Python / Waitress Django IIS
Оглавление:
  1. Waitress WSGI сервер
  2. Waitress Django на платформе Windows
  3. Работа Waitress и WSGI приложения на сервере IIS
  4. Развертывание Django на сервере IIS
  5. Установка пакета Waitress
  6. Создание корневого web.config
  7. Обслуживание статических файлов сервером IIS
  8. Настройки веб-приложения Джанго для производственной работы
  9. Исходник сайта Django для работы с сервером WSGI Waitress

Waitress WSGI сервер

Waitress WSGI server Pylons

Waitress молодой легкий WSGI-сервер на чистом Python производственного качества с очень приемлемой производительностью. Не похож своим стилем работы на другие WSGI серверы. Его легко установить, он не требует дополнительных зависимостей, кроме тех, которые находятся в стандартной библиотеке Python.

Waitress использует комбинацию асинхронного и синхронного кода для выполнения своей работы и обслуживает запросы через потоки. Работает в Unix и Windows под управлением Python 3.7+ и поддерживает протоколы HTTP/1.0 и HTTP/1.1. Официальная документация и настройки безопасности сервера находятся по адресу Waitress documentation ↗

Waitress Django на платформе Windows

После окончания тестирования сайта 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.

Если возникнут какие-либо затруднения с публикацией веб-проекта, информацию о публикации можно получить на странице Публикация веб-проекта Python в Visual Studio.

Работа Waitress и WSGI приложения на сервере IIS

Первичный запуск сервера Waitress в Windows будет осуществлять службы IIS, причем это будет происходить автоматически. При первом клиентском запросе создается рабочий процесс IIS (в диспетчере задач он под названием IIS Worker Process) и запускаются два интерпретатора Python: один базовый, который имеет основные библиотеки, второй - интерпретатор виртуальной среды. Последний запускает Waitress со связанным WSGI приложением. Waitress начинает прослушивать HTTP-запросы посредством служб IIS на разрешенном имени хоста.

Далее Waitress непрерывно получает клиентские запросы и отправляет ответы клиентам посредством служб IIS. Данная интернет работа длится безостановочно и в случае сбоя работы или перезагрузки самого сервера IIS, очередной запрос клиента вновь восстанавливает вышеописанную цепочку. Таким образом обеспечивается надежная работа сервера WSGI Waitress в паре с веб-приложением Python.

Развертывание Django на сервере IIS

После того как, всё содержимое публикации проекта Python успешно скопировано в папку хоста локального сервера IIS восстанавливается виртуальная среда согласно списка requirements.txt, сформированного перед публикацией.

Если вы используете прикрепленный ниже исходник, обращайте внимание на версию интерпретатора для создания виртуальной среды: для данного исходника требуется версия Python в рамках 3.8 – 3.9. В случае каких-либо ошибок при установке виртуальной среды ее папку можно удалить и повторить установку, локальность - одно из главных достоинств виртуальных сред Python.

Установка пакета Waitress

Программный пакет сервера 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 в проект Django
Установка сервера Waitress в проект Django

Создание корневого web.config

Итак, файлы публикации на хост загружены, виртуальная среда восстановлена, пакет 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 файлами для записей событий работы сервера:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" 
	  modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\env\Scripts\python.exe" 
	arguments="manage.py runwaitress" stdoutLogEnabled="true" 
	stdoutLogFile=".\logs\django-waitress">		
    </aspNetCore>
  </system.webServer>
</configuration>

Модуль ANCM будет запускать интерпретатор виртуальной среды проекта Django с аргументами
manage.py runwaitress. Название аргумента runwaitress — это собственное произвольное и можно определить любое желаемое.

Обслуживание статических файлов сервером IIS

Сайт Django без статических файлов
Сайт Django без статических файлов

После создания корневого web.config и корректировки утилиты командной строки Django manage.py сайт успешно запустится. Как видно на скриншоте выше сайт запустился, но без декоративных стилей. Дело в том, что сервер Waitress не предназначен для обслуживания статических файлов. Да и в этом нет необходимости, Waitress будет работать с «легким» html контентом, а со статическими файлами легко справится мощный сервер IIS.

Для задействования статических файлов приложений проекта Django соберем всю статику в отдельную папку, название которой указано в модуле settings.py настроек проекта, в константе STATIC_ROOT. Фреймворк Django имеет некоторые особенности работы со статическими файлами, для ознакомления с которыми которых можно обратиться к странице Django и статические файлы данного сайта.

Для сбора статических файлов применяется команда:
manage.py collectstatic набранную в командной строке, вызванной в корневой папке проекта Django, команду следует выполнять при активированной виртуальной среде проекта.

Сбор статических файлов проекта Django
Сбор статических файлов проекта Django

После процедуры сбора в корневой папке появится каталог со статическими файлами проекта, в прикрепленном исходнике определено название каталога static. Теперь разрешим серверу IIS обрабатывать статические файлы в данном каталоге и для этого создадим в нем локальный web.config, код которого ниже.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false" />
        <handlers>
            <add name="stat1" path="*.*" verb="*" modules="StaticFileModule" resourceType="File" />
        </handlers>
        <urlCompression doStaticCompression="true" />
    </system.webServer>
</configuration>

Теперь сайт будет выглядеть значительно привлекательней. И если с помощью инструментов разработчика браузера проверить заголовки, то можно удостовериться, что html файлы обрабатывает сервер Waitress, а файлы css, js, images обслуживает сервер IIS. Работа Waitress значительно облегчается, т. к. основную нагрузку от запросов статических файлов на себя берет производительный и мощный IIS. Кроме того, директива <urlCompression doStaticCompression="true" /> дает команду серверу IIS уменьшать размеры методом сжатия GZip отправляемое браузеру статическое содержимое.

Сайт Django со стилями
Сайт Django со стилями

Настройки веб-приложения Джанго для производственной работы

Для экономии трафика и увеличения скорости загрузки веб-страниц в модуле settings.py проекта Django очень желательно добавить промежуточное программное обеспечение django.middleware.gzip.GZipMiddleware
для сжатии html содержимого. Как рекомендуют разработчики Django: это промежуточное программное обеспечение должно быть размещено перед любым другим промежуточным программным обеспечением, которое читает или записывает тело ответа.

MIDDLEWARE = [
    # Сжимает содержимое для браузеров, поддерживающих сжатие GZip
    'django.middleware.gzip.GZipMiddleware',
    ...
]

И самое главное, перед размещением контента сайта на внешнем хостинге необходимо проверить настройки безопасности сайта. Для облегчения проверки сайта на безопасность разработчики Django предусмотрели специальную команду:
manage.py check --deploy это программная утилита проверки готовности сайта к развертыванию. Данную команду запускают командной строкой из корневой папки хоста при активированной виртуальной среде. Для максимальной безопасности все предупреждения должны быть устранены. Первоисточник о настройках безопасности находится в актуальной документации Django ↗.

Проверка безопасности сайта Django
Проверка безопасности сайта Django

Исходник сайта Django для работы с сервером WSGI Waitress

Прикрепленный исходник содержит опубликованный сайт Django для работы с производственным сервером Waitress на платформе Windows IIS. Исходник не включает виртуальную среду, которая создается самостоятельно по описанию в данной статье.

Для функционирования сайта необходимо использовать интерпретатор Python версий 3.8 – 3.9. Для сайта используется база MySQL, необходимый файл sql для создания базы включен. Имя для базы MySQL shop_electronics, но вы можете изменить эти настройки в модуле settings.py, в константе DATABASES.

Скачать исходник

Тема: «Waitress Django IIS» Язык программирования Python django-waitress-vs17.zip Размер:519 КбайтЗагрузки:29