Обслуживание 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-приложения. Можно включить различные дополнительные функции.
Предупреждение
Не используйте сервер разработки при развертывании в рабочей среде. Он предназначен только для использования во время разработки на локальном компьютере. Он не предназначен для высокой эффективности, стабильности или безопасности.
- Параметры:
-
-
hostname (str) – Хост, к которому нужно подключиться, например
'localhost'. Может быть доменом, IPv4 или IPv6 адресом, или путём к файлу, начинающимся сunix://для Unix-сокет. -
port (int) – Порт для подключения, например
8080. Использование0заставляет операционную систему выбрать случайный свободный порт. - application (WSGIApplication) – WSGI-приложение, которое нужно запустить.
- use_reloader (bool) – Использовать процесс перезагрузки, чтобы перезапустить серверный процесс при изменении файлов.
- use_debugger (bool) – Использовать отладчик Werkzeug, который отобразит отформатированные трассировки при необработанных исключениях.
- use_evalex (bool) – Сделать отладчик интерактивным. Для любой рамки в трассировке можно открыть терминал Python. Некоторое ограничение обеспечивается требованием PIN-кода, но это никогда не должно активироваться на публичном сервере.
- extra_files (t.Iterable[str] | None) – Загрузчик будет следить за изменениями в этих файлах помимо модулей Python. Например, следить за файлом конфигурации.
-
exclude_patterns (t.Iterable[str] | None) – Загрузчик проигнорирует изменения в любых файлах, соответствующих этим шаблонам
fnmatch. Например, игнорировать файлы кэша. - reloader_interval (int) – Как часто загрузчик пытается проверить изменения.
-
reloader_type (str) – Используемый загрузчик. Встроенный загрузчик
'stat', но может потребовать значительных ресурсов процессора для отслеживания файлов. Загрузчик'watchdog'намного эффективнее, но для его использования необходимо предварительно установить пакетwatchdog. -
threaded (bool) – Обрабатывать параллельные запросы с помощью потоков. Нельзя использовать с
processes. -
processes (int) – Обрабатывать параллельные запросы, используя до этого количества процессов. Нельзя использовать с
threaded. -
request_handler (type[WSGIRequestHandler] | None) – Использовать другой
BaseHTTPRequestHandlerподкласс для обработки запросов. -
static_files (dict[str, str | tuple[str, str]] | None) – Словарь, сопоставляющий префиксы URL-адресов с каталогами для обслуживания статических файлов с использованием
SharedDataMiddleware. -
passthrough_errors (bool) – Не перехватывать необработанные исключения на уровне сервера, позволять серверу аварийно завершиться. Если
use_debuggerвключен, отладчик по-прежнему перехватит такие ошибки. -
ssl_context (_TSSLContextArg | None) – Настроить TLS для обслуживания по HTTPS. Может быть объектом
ssl.SSLContext, кортежем(cert_file, key_file)для создания типичного контекста или строкой'adhoc'для генерации временного самоподписанного сертификата.
-
hostname (str) – Хост, к которому нужно подключиться, например
- Тип возвращаемого значения:
-
None
Изменения
Изменено в версии 2.1: Показаны инструкции по работе с ошибкой «адрес уже используется».
Изменено в версии 2.1: Запуск на
0.0.0.0или::отображает локальный IP-адрес в дополнение к реальному IP-адресу.Изменено в версии 2.1: Интерфейс командной строки был удален.
Изменено в версии 2.0: Запуск на
0.0.0.0или::показывает реальный IP-адрес, который был привязан, а также предупреждение о том, что сервер разработки не следует запускать в рабочей среде.Изменено в версии 2.0: Добавлен параметр
exclude_patterns.Изменено в версии 0.15: Подключение к Unix-сокету путём передачи
hostname, начинающегося сunix://.Изменено в версии 0.10: Улучшен загрузчик и добавлена поддержка изменения бэкенда через параметр
reloader_type.Изменено в версии 0.9: Добавлен интерфейс командной строки.
Изменено в версии 0.8:
ssl_contextможет быть кортежем путей к файлам сертификата и закрытого ключа.Изменено в версии 0.6: Добавлен параметр
ssl_context.Изменено в версии 0.5: Добавлены параметры
static_filesиpassthrough_errors.
-
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]в ваш файл требований.
Если watchdog установлен и доступен, он будет автоматически использован вместо встроенного релоадера stat.
Чтобы переключаться между бэкэндами, вы можете использовать параметр reloader_type функции run_simple(). 'stat' устанавливает его на стандартное статистическое опробование, а 'watchdog' принудительно переключает его на бэкэнд watchdog.
Примечание
Некоторые частные случаи, такие как модули, которые не удалось импортировать должным образом, не обрабатываются релоадером stat по соображениям производительности. Релоадер 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.
Остановка сервера
В некоторых случаях может быть полезно остановить сервер после обработки запроса. Например, локальный инструмент командной строки, который требует аутентификации OAuth, может временно запустить сервер для прослушивания ответа, записи токена пользователя, а затем остановить сервер.
Один из методов — запустить сервер в процессе multiprocessing, а затем завершить процесс после возвращения значения родительскому процессу.
import multiprocessing
from werkzeug import Request, Response, run_simple
def get_token(q: multiprocessing.Queue) -> None:
@Request.application
def app(request: Request) -> Response:
q.put(request.args["token"])
return Response("", 204)
run_simple("localhost", 5000, app)
if __name__ == "__main__":
q = multiprocessing.Queue()
p = multiprocessing.Process(target=get_token, args=(q,))
p.start()
print("waiting")
token = q.get(block=True)
p.terminate()
print(token)
В этом примере используется сервер разработки Werkzeug, но любой производственный сервер, который можно запустить как процесс Python, может использовать ту же технику и должен быть предпочтительным по соображениям безопасности. Другой метод — запустить процесс subprocess и отправить значение обратно через stdout.
Отладка
На операционных системах, которые поддерживают 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'))
После этого вам нужно будет принять сертификат в вашем браузере.
Загрузка контекстов вручную
Вы можете использовать объект 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
Adhoc Сертификаты
Самый простой способ включить SSL — запустить сервер в режиме adhoc. В этом случае Werkzeug сгенерирует для вас SSL-сертификат:
run_simple('localhost', 4000, application,
ssl_context='adhoc')
Конечно, недостатком является то, что вам придётся подтверждать сертификат каждый раз, когда сервер перезагружается. Сертификаты adhoc не рекомендуется использовать, так как современные браузеры плохо справляются с их поддержкой по соображениям безопасности.
Эта функция требует установки библиотеки cryptography.
Unix-сокеты
Сервер разработки может привязываться к Unix-сокету вместо TCP-сокету. run_simple() привяжется к Unix-сокету, если параметр hostname начинается с 'unix://'.
from werkzeug.serving import run_simple
run_simple('unix://example.sock', 0, app)
© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/latest/serving/