Оказание WSGI-приложений
Существует множество способов оказания WSGI-приложения. Во время разработки вы обычно не хотите использовать полнофункциональный веб-сервер, как Apache, а вместо этого простой автономный. Именно поэтому Werkzeug поставляется со встроенным сервером разработки.
Самый простой способ — создание небольшого start-myproject.py файла, который запускает приложение с помощью встроенного сервера:
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, exclude_patterns=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
Изменено в версии 2.0: Добавлен
exclude_patternsпараметр.Журнал изменений
Изменено в версии 0.15: Связывание с сокетом Unix путём передачи пути, начинающегося с
unix://в качествеhostname.Добавлен в версии 0.10: Улучшен механизм перезагрузки и добавлена поддержка изменения бэкенда через
reloader_typeпараметр. Дополнительная информация представлена в разделе Перезагрузчик.Добавлен в версии 0.9: Добавлен интерфейс командной строки.
Добавлен в версии 0.8: Добавлена поддержка автоматической загрузки контекста SSL из файла сертификата и закрытого ключа.
Добавлен в версии 0.6: Добавлена поддержка SSL.
Добавлен в версии 0.5:
static_filesбыл добавлен для упрощения оказания статических файлов, а такжеpassthrough_errors.- Параметры
-
-
hostname (str) – Хост, к которому нужно подключиться, например
'localhost'. Если значение представляет собой путь, начинающийся сunix://, то произойдёт подключение к сокету Unix, а не сокету TCP. -
port (int) – Порт сервера. Пример:
8080 - application (WSGIApplication) – WSGI-приложение для выполнения
- use_reloader (bool) – должен ли сервер автоматически перезапускать процесс Python, если были изменены модули?
- use_debugger (bool) – должен ли использоваться отладчик Werkzeug?
- use_evalex (bool) – должна ли быть включена функция оценки исключений?
- extra_files (Optional[Iterable[str]]) – список файлов, которые перезагрузчик должен дополнительно отслеживать помимо модулей. Например, файлы конфигурации.
-
exclude_patterns (Optional[Iterable[str]]) – Список
fnmatchшаблонов для игнорирования при запуске перезагрузчика. Например, игнорирование файлов кэша, которые не должны перезагружаться при обновлении. - reloader_interval (int) – интервал перезагрузки в секундах.
-
reloader_type (str) – тип используемого перезагрузчика. По умолчанию используется автоматическое определение. Допустимые значения:
'stat'и'watchdog'. Дополнительная информация приведена в разделе Перезагрузчик. - threaded (bool) – должен ли процесс обрабатывать каждый запрос в отдельном потоке?
- processes (int) – если значение больше 1, то каждый запрос будет обрабатываться в новом процессе до максимального числа одновременных процессов.
-
request_handler (Optional[Type[werkzeug.serving.WSGIRequestHandler]]) – необязательный параметр, который можно использовать для замены значения по умолчанию. Можно использовать его для замены на другой
BaseHTTPRequestHandlerподкласс. -
static_files (Optional[Dict[str, Union[str, Tuple[str, str]]]]) – список или словарь путей к статическим файлам. Работает аналогично
SharedDataMiddleware, по сути, просто оборачивает приложение в этот middleware перед оказанием. -
passthrough_errors (bool) – установите это в
Trueдля отключения обработки ошибок. Это означает, что сервер завершится при ошибках, но может быть полезно для подключения отладчиков (pdb и т. д.). -
ssl_context (Optional[Union[ssl.SSLContext, Tuple[str, Optional[str]], te.Literal['adhoc']]]) – контекст SSL для соединения. Либо
ssl.SSLContext, кортеж в формате(cert_file, pkey_file), строка'adhoc'(если сервер должен автоматически создать один) илиNoneдля отключения SSL (по умолчанию).
-
hostname (str) – Хост, к которому нужно подключиться, например
- Тип возвращаемого значения
-
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.
Информация
Сервер разработки не предназначен для использования в производственных системах. Он разработан специально для целей разработки и плохо работает при высокой нагрузке. Для развертывания обратитесь к страницам Развертывания приложений.
Перезагрузчик
Журнал изменений
Изменено в версии 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 отслеживает такие файлы тоже.
Цветной вывод журнала
Сервер разработки выделяет записи запросов разными цветами в зависимости от кода состояния. В Windows для активации этой функции необходимо также установить Colorama.
Виртуальные хосты
Многие веб-приложения используют несколько доменных имен. Иногда это немного сложно симулировать локально. К счастью, для этого можно использовать файл hosts, который позволяет назначить локальному компьютеру несколько имен.
Это позволяет называть ваш локальный компьютер yourapplication.local и api.yourapplication.local (или что-нибудь ещё) помимо localhost.
Вы можете найти файл hosts по следующим адресам:
Windows |
|
Linux / OS X |
|
Вы можете открыть этот файл с помощью текстового редактора и добавить новое имя после 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-разработку с 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'))
Вам необходимо будет принять сертификат в своём браузере один раз.
Загрузка контекстов вручную
Вы можете использовать объект ssl.SSLContext вместо кортежа для полного управления настройками TLS.
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
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')
Конечно, недостатком этого является то, что вам придётся каждый раз подтверждать сертификат при перезагрузке сервера. Временные сертификаты не рекомендуется использовать, так как современные браузеры плохо их поддерживают по соображениям безопасности.
Для этой функции требуется библиотека cryptography.
Unix-сокеты
Сервер разработки может привязаться к Unix-сокету вместо TCP-сокету. run_simple() привяжется к Unix-сокету, если параметр hostname начинается с 'unix://'.
from werkzeug.serving import run_simple
run_simple('unix://example.sock', 0, app)
© 2007–2021 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.0.x/serving/