При разработке приложения Flask в интегрированной среде Visual Studio, перед публикацией его на внешнем хостинге желательно протестировать работу сайта на локальном хосте. Веб-приложения, написанные на языке Python, полноценно работают на сервере IIS, не требуя много настроек.
Исходник простейшего сайта, прикрепленный к данной статье, содержит пример работы Flask-приложения через базовый модуль ASP.NET Core ANCM. В качестве промежуточного сервера, связывающего приложение и внешний IIS использован отладочный сервер поставляемый с фреймворком Flask. Чтобы успешно запустить приложение необходимо создать и настроить файл web.config для правильного взаимодействия промежуточного программного обеспечения с сервером IIS.
Примечание. В исходнике используется отладочный сервер, предназначенный для использования во время разработки на локальном хосте. Для безопасной работы веб-приложения на внешнем хостинге необходимо использовать сервер WSGI, например Waitress.
Процесс публикации в среде программирования Visual Studio представляет собой подготовку рабочего комплекта файлов и папок для размещения на внешнем ресурсе, например: папка, сервер, облако и другое. Публикация включает несколько шагов настроек, показанных последовательно ниже на картинках.
Запуск публикации из контекстного меню правой кнопкой на названии проекта:
Выбор публикации приложения в локальной папке:
Выбор расположения папки публикации:
Создание профиля публикации:
После нажатие кнопки Опубликовать, Visual Studio сформирует комплект папок и файлов в выбранной папке публикации.
Начиная с Visual Studio 2017 перед публикацией появляется диалоговое окно с информацией о том, что Публикация проектов Python была недавно изменена и файл конфигурации web.config автоматически не создается. Конфигурационный xml-файл web.config находится в корневой папке приложения и данные из файла управляют настройками сервера IIS. Например, web.config указывает серверу IIS посредством какого обработчика будут обрабатываться HTTP запросы для веб-приложений, написанных на языке Python.
При разработке в Visual Studio 2017 и более поздних версий необходимо вручную создавать и наполнять файл web.config. Это связано с несколькими вариантами взаимодействия веб-приложений Python с сервером IIS. Запросы приложений могут обрабатываться модулями FastCGI, HttpPlatformHandler и базовым модулем ASP.NET Core: ANCM (AspNetCoreModule). В данной статье описывается запуск веб-приложения Python Flask посредством модуля ANCM версии 2.
Для публикации можно использовать любую удобную папку. Среда Visual Studio в целевую папку копирует только файлы приложения, виртуальное окружение не копируется. Виртуальное окружение в дальнейшем можно создать непосредственно в папке хоста используя окно командной строки или скопировать существующее из проекта.
Содержимое из папки публикации копируется в каталог локального хоста. Туда же копируется папка виртуального окружения env из проекта FlaskWebProjectEmpty, исходный код которого прикреплен к странице Веб-приложения на Python Flask в Visual Studio.
В файле env/pyvenv.cfg в строке home прописывается путь до основного интерпретатора Python.
home = путь_до_основного_интерпретатора_Python
Создаем в папке хоста каталог logs для файлов записи событий работы веб-приложения и пустой файл web.config для определения параметров работы веб-приложения Flask. Файл requirements.txt может пригодиться в будущем для обновления фреймворка Flask. На этом этапе файловая комплектация хоста заканчивается и можно переходить к программной настройке сопряжения веб-приложения Python и сервера IIS.
Скриншот созданной комплектации каталога локального хоста для приложения Flask:
Модуль ANCM (AspNetCoreModule) перенаправляет внешние веб-запросы от сервера IIS на промежуточное программное обеспечение, роль которого выполняют отладочный сервер или сервер WSGI, веб-приложение Python обрабатывает запрос от промежуточного ПО и отправляет ответ обратно серверу IIS. Перенаправление веб-запросов в серверное приложение Python через отладочный или сервер WSGI, называется моделью размещения вне рабочего процесса IIS. Данная модель дает возможность работы на сервере IIS веб-приложениям, написанным на любом языке программирования.
AspNetCoreModule устанавливается вместе со средой выполнения .NET Core. Практически это означает, что на сервере IIS, подготовленном для работы приложений ASP.NET уже содержится модуль ANCM.
На следующей диаграмме показана взаимосвязь между IIS, модулем ANCM и приложением Python, размещенным вне процесса:
Запросы поступают из Интернета на сервер IIS через настроенный порт веб-сайта. Настроенный порт обычно 80 (HTTP) или 443 (HTTPS).
Модуль ANCM перенаправляет запросы в ПО (в нашем случае отладочный сервер Flask или WSGI-сервер) для приложения на случайный порт, исключая номера 80 и 443. ANCM указывает порт через переменную среды ASPNETCORE_PORT при запуске.
Конфигурационный файл web.config настраивает взаимодействие веб-приложения Python с сервером IIS, в нашем случае, посредством модуля ANCM. Ниже показан xml-код файла конфигурации для настройки работы приложения Flask. Исходник прикрепленного веб-приложения содержит два файла запуска (app.py и app2.py) с различными фронтендами веб-страниц. Для запусков разных приложений необходимо изменять значение атрибута arguments.
Содержит определение обработчика запросов для приложения.
Элемент aspNetCore
Определяет атрибуты настроек функционирования веб-приложения.
Атрибут processPath
Указывает путь до интерпретатора виртуальной среды, в которой содержатся пакеты фреймворка Flask.
Атрибут arguments
Указывает на стартовый файл приложения.
Атрибуты stdoutLogEnabled и stdoutLogFile
Разрешают и определяют путь файла хронологических записей событий и ошибок, возникающих при работе приложения.
В данном web.config указывается относительный путь файлов и каталогов, отсчитываемый от места нахождения самого конфигурационного файла. Использование относительных путей удобно при смене папок хоста.
Если запустить приложение Flask в браузере сразу после формирования конфигурационного файла, то страница будет очень долго загружаться и в конце концов выдаст ошибку 502.5 – сбой запуска модуля ANCM вне процесса, полный текст ошибки смотрите ниже. Обратите внимание на последнюю строчку возможных решений этой проблемы: The application process started but failed to listen on the configured port (Процесс приложения стартовал, но не удалось прослушать настроенный порт).
HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure
Common solutions to this issue:
The application process failed to start
The application process started but then stopped
✔The application process started but failed to listen on the configured port
Troubleshooting steps:
Check the system event log for error messages
Enable logging the application process' stdout messages
Attach a debugger to the application process and inspect
Дело в том, что при запуске на отладочном сервере номер порта хранится в переменной среды SERVER_PORT. Но в среде ASP.NET номер порта представляется другой переменной ASPNETCORE_PORT. Если раскомментировать строки вывода списка переменных среды, то в файлах .log можно увидеть ASPNETCORE_PORT и не найти переменную SERVER_PORT.
Для корректировки ошибки изменяем строчку программного кода получения номера порта, получаемого от модуля ANCM как показано ниже в программном коде приложения. После этого приложение запустится успешно.
Программный код приложения app.py построенном на фреймворке Flask:
# ===== Запуск Flask веб-приложения на сервере IIS =====
# Доступ к определению класса Flask
from flask import Flask
# Каждое веб-приложение создает экземпляр класса Flask
app = Flask(__name__)
# Маршрутизатор на основе декоратора запускает функцию hello() по адресу "/"
@app.route('/')
def hello():
# Вывод html-кода в браузер по указанному
# в маршрутизаторе адресу
return "
Hello World! Привет Мир!
"
if __name__ == '__main__':
import os
# Получение имени хоста для запуска веб-приложения.
# Настраивается в свойствах проекта.
HOST = os.environ.get('SERVER_HOST', '127.0.0.1')
# Если раскомментировать строки ниже
# в файле .log распечатается список
# переменных среды со значениями.
print("===== Переменнные среды =====")
for key in os.environ.keys() :
print("{0}: {1}".format(key, os.environ[key]), end="\n")
print("===== /Переменнные среды ===== \n")
try:
# Номер порта, на котором запустится веб-приложение
# выбирается системой случайным образом.
# В среде ASP.NET номер порта хранится в
# переменной ASPNETCORE_PORT.
#PORT = int(os.environ.get('SERVER_PORT', '5789'))
PORT = int(os.environ.get('ASPNETCORE_PORT', '5789'))
except ValueError:
# При ошибке получения порта доступа к веб-приложению
# определяется порт по умолчанию
PORT = 5789
# Запуск сервера разработки в отладочном режиме
app.run(HOST, PORT, True)
Исходник содержит копию файлов и папок приложения Flask в комплекте с виртуальной средой. Исходник протестирован на работе с сервером IIS 8+. Для работы на хосте вашей машины необходимо указать путь до основного интерпретатора Python. Путь прописывается в конфигурационном файле виртуальной среды: .\env\ pyvenv.cfg: