Обслуживание WSGI-приложений
Существует множество способов обслуживания WSGI-приложений. Во время разработки обычно не требуется запуск полноценного веб-сервера, такого как Apache, а вместо этого используется простой автономный сервер. Именно поэтому Werkzeug поставляется со встроенным сервером разработки.
Самый простой способ — создание небольшого start-myproject.py файла, который запускает приложение с использованием встроенного сервера:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from werkzeug.serving import run_simple
from myproject import make_app
app = make_app(...)
run_simple('localhost', 8080, app, use_reloader=True)
Вы также можете передать ему extra_files ключевое слово с списком дополнительных файлов (например, файлов конфигурации), которые вы хотите отслеживать.
-
werkzeug.serving.run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='auto', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None) -
Запуск WSGI-приложения. Дополнительные возможности включают перезагрузчик, поддержку многопоточности и виртуализации.
Эта функция также имеет интерфейс командной строки:
python -m werkzeug.serving --help
Новая в версии 0.5:
static_filesбыл добавлен для упрощения обслуживания статических файлов, а такжеpassthrough_errors.Новая в версии 0.6: была добавлена поддержка SSL.
Новая в версии 0.8: Добавлена поддержка автоматической загрузки SSL-контекста из файла сертификата и закрытого ключа.
Новая в версии 0.9: Добавлен интерфейс командной строки.
Новая в версии 0.10: Улучшен перезагрузчик и добавлена поддержка изменения бэкэнда через параметр
reloader_type. Дополнительную информацию см. в разделе Перезагрузчик.Изменено в версии 0.15: Связь с сокетом Unix осуществляется путём передачи пути, начинающегося с
unix://в качествеhostname.Параметры: -
hostname – Хост для привязки, например
'localhost'. Если значение представляет собой путь, начинающийся сunix://, то вместо TCP-соккета будет использоваться сокет Unix. -
port – Порт сервера. Например:
8080 - application – WSGI-приложение для выполнения
- use_reloader – должен ли сервер автоматически перезапускать процесс Python, если были изменены модули?
- use_debugger – использовать ли систему отладки Werkzeug?
- use_evalex – включить ли функцию оценки исключений?
- extra_files – список файлов, которые перезагрузчик должен отслеживать дополнительно к модулям. Например, файлы конфигурации.
- reloader_interval – интервал перезагрузчика в секундах.
-
reloader_type – тип перезагрузчика для использования. По умолчанию используется автоматическое определение. Допустимые значения:
'stat'и'watchdog'. Дополнительную информацию см. в разделе Перезагрузчик. - threaded – должен ли процесс обрабатывать каждый запрос в отдельном потоке?
- processes – если больше 1, то обрабатывать каждый запрос в новом процессе до максимального числа одновременных процессов.
-
request_handler – необязательный параметр, который может быть использован для замены стандартного обработчика. Вы можете использовать его для замены на другой класс
BaseHTTPRequestHandler. -
static_files – список или словарь путей для статических файлов. Работает точно так же, как
SharedDataMiddleware, фактически он просто обертывает приложение в этот посредник перед обслуживанием. -
passthrough_errors – установите это в
Trueдля отключения обработки ошибок. Это означает, что сервер прекратит работу при ошибках, но может быть полезно для подключения отладчиков (pdb и т. д.). -
ssl_context – контекст SSL для соединения. Либо
ssl.SSLContext, кортеж в формате(cert_file, pkey_file), строка'adhoc'если сервер должен автоматически создать один, илиNoneдля отключения SSL (по умолчанию).
-
hostname – Хост для привязки, например
-
werkzeug.serving.is_running_from_reloader() -
Проверяет, запускается ли приложение из подпроцесса перезагрузчика Werkzeug.
Новая в версии 0.10.
-
werkzeug.serving.make_ssl_devcert(base_path, host=None, cn=None) -
Создаёт SSL-ключ для разработки. Это следует использовать вместо
'adhoc'ключа, который генерирует новый сертификат при каждом запуске сервера. Он принимает путь для хранения ключа и сертификата и либо хост, либо CN. Если задан хост, то будет использоваться CN*.host/CN=host.Для получения дополнительной информации см.
run_simple().Новая в версии 0.9.
Параметры: -
base_path – путь к сертификату и ключу. Расширение
.crtдобавляется для сертификата,.keyдобавляется для ключа. -
host – имя хоста. Это может быть использовано как альтернатива
cn. -
cn – используемый
CN.
-
base_path – путь к сертификату и ключу. Расширение
Информация
Сервер разработки не предназначен для использования в производственных системах. Он был разработан специально для целей разработки и плохо работает при высокой нагрузке. Для конфигураций развертывания ознакомьтесь со страницами Развертывание приложений.
Перезагрузчик
Изменено в версии 0.10.
Перезагрузчик Werkzeug постоянно отслеживает модули и пути вашего веб-приложения и перезапускает сервер, если какие-либо из наблюдаемых файлов изменяются.
С версии 0.10 перезагрузчик поддерживает два бэкэнда: stat и watchdog.
- По умолчанию бэкенд
statпросто проверяетmtimeвсех файлов с регулярным интервалом. Это подходит для большинства случаев, однако известно, что оно разряжает батарею ноутбука. - Бэкенд
watchdogиспользует события файловой системы и значительно быстрее, чемstat. Для его работы требуется модуль watchdog. Рекомендуемый способ достижения этого — добавлениеWerkzeug[watchdog]в ваш файл requirements.
Если watchdog установлен и доступен, он автоматически используется вместо встроенного stat перезагрузчика.
Для переключения между бэкендами можно использовать параметр reloader_type функции run_simple(). 'stat' устанавливает его в значение по умолчанию — основанное на опросе статистики, и 'watchdog' принудительно переключается на бэкенд watchdog.
Примечание
Некоторые особые случаи, такие как модули, которые не смогли импортироваться должным образом, не обрабатываются перезагрузчиком на основе статистики по производительности. Перезагрузчик watchdog отслеживает такие файлы.
Цветной вывод логов
Werkzeug может отображать выводы логов запросов в цвете, когда запущен из терминала, достаточно установить пакет termcolor. Пользователям Windows необходимо дополнительно установить colorama для корректной работы.
Виртуальные хосты
Многие веб-приложения используют несколько доменных имён. Это может быть немного сложно смоделировать локально. К счастью, для этого можно использовать файл hosts.
Это позволяет называть ваш локальный компьютер yourapplication.local и api.yourapplication.local (или что-либо другое) в дополнение к localhost.
Вы можете найти файл hosts по следующим адресам:
| Windows | %SystemRoot%\system32\drivers\etc\hosts |
| Linux / OS X | /etc/hosts |
Вы можете открыть файл в вашем любимом текстовом редакторе и добавить новое имя после localhost:
127.0.0.1 localhost yourapplication.local api.yourapplication.local
Сохраните изменения, и вскоре вы сможете получить доступ к серверу разработки по этим именам хостов. Вы можете использовать систему маршрутизации URL для перенаправления между различными хостами или самостоятельно парсить request.host.
Остановка сервера
Новая в версии 0.7.
Начиная с Werkzeug 0.7, сервер разработки предоставляет способ остановки сервера после обработки запроса. В настоящее время это работает только с Python 2.6 и выше и только с сервером разработки. Для инициирования остановки нужно вызвать функцию с именем 'werkzeug.server.shutdown' в среде WSGI:
def shutdown_server(environ):
if not 'werkzeug.server.shutdown' in environ:
raise RuntimeError('Not running the development server')
environ['werkzeug.server.shutdown']()
Устранение неполадок
На операционных системах, поддерживающих ipv6 и имеющих его настроенным, таких как современные системы Linux, OS X 10.4 и выше, а также Windows Vista, некоторые браузеры могут работать очень медленно при доступе к вашему локальному серверу. Причина в том, что иногда «localhost» настроен на доступность как по ipv4, так и по ipv6 сокетам, и некоторые браузеры будут пытаться сначала получить доступ к ipv6, а затем к ipv4.
В настоящее время интегрированный веб-сервер не поддерживает ipv6 и ipv4 одновременно, и для лучшей переносимости по умолчанию используется ipv4.
Если вы заметили, что браузер тратит много времени на загрузку страницы, есть два способа решения этой проблемы. Если вам не нужна поддержка ipv6, вы можете отключить запись ipv6 в файле hosts, удалив эту строку:
::1 localhost
В качестве альтернативы, вы также можете отключить поддержку ipv6 в своём браузере. Например, если Firefox демонстрирует такое поведение, вы можете отключить его, перейдя к about:config и отключив ключ network.dns.disableIPv6 . Однако это не рекомендуется с версии Werkzeug 0.6.1!
Начиная с Werkzeug 0.6.1, сервер теперь переключается между ipv4 и ipv6 в зависимости от конфигурации вашей операционной системы. Это означает, что если вы отключили поддержку ipv6 в своём браузере, но ваша операционная система предпочитает ipv6, вы не сможете подключиться к серверу. В этом случае вы можете либо удалить запись localhost для ::1 или явно привязать имя хоста к ipv4-адресу (127.0.0.1)
SSL
Новое в версии 0.6.
Встроенный сервер поддерживает SSL для целей тестирования. Если предоставлен контекст SSL, он будет использован. Это означает, что сервер может работать как в режиме HTTP, так и в режиме HTTPS, но не в обоих одновременно.
Быстрый старт
Самый простой способ разработки на основе SSL с Werkzeug — это использование его для генерации сертификата SSL и закрытого ключа, сохранение их где-нибудь, а затем размещение их там. Для сертификата вам необходимо указать имя вашего сервера при генерации или CN.
-
Сгенерируйте ключ SSL и сохраните его где-нибудь:
>>> from werkzeug.serving import make_ssl_devcert >>> make_ssl_devcert('/path/to/the/key', host='localhost') ('/path/to/the/key.crt', '/path/to/the/key.key') -
Теперь эту кортеж можно передать в качестве
ssl_contextметодуrun_simple():run_simple('localhost', 4000, application, ssl_context=('/path/to/the/key.crt', '/path/to/the/key.key'))
Вам необходимо будет один раз подтвердить сертификат в вашем браузере.
Загрузка контекстов вручную
В Python 2.7.9 и 3+ у вас также есть возможность использовать объект ssl.SSLContext вместо простой кортежи. Таким образом, вы получите больший контроль над поведением SSL встроенного сервера Werkzeug:
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
ctx.load_cert_chain('ssl.cert', 'ssl.key')
run_simple('localhost', 4000, application, ssl_context=ctx)
Генерация сертификатов
Ключ и сертификат можно создать заранее с помощью инструмента openssl вместо make_ssl_devcert(). Для этого вам необходимо установить команду openssl на вашей системе:
$ openssl genrsa 1024 > ssl.key $ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert
Адаптивные сертификаты
Самый простой способ включить SSL — запустить сервер в режиме adhoc. В этом случае Werkzeug сгенерирует для вас сертификат SSL:
run_simple('localhost', 4000, application,
ssl_context='adhoc')
Недостатки этого, конечно, заключаются в том, что вам нужно будет подтверждать сертификат каждый раз при перезагрузке сервера. Адаптивные сертификаты не рекомендуются, поскольку современные браузеры плохо поддерживают их по соображениям безопасности.
Эта функция требует установки библиотеки pyOpenSSL.
Сокеты Unix
Сервер разработки может быть привязан к сокету Unix вместо TCP-сокета. run_simple() будет привязан к сокету Unix, если параметр hostname начинается с 'unix://'.
from werkzeug.serving import run_simple
run_simple('unix://example.sock', 0, app)
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/0.16.x/serving/