Обслуживание 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-адреса.Изменено в версии 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]в ваш файл requirements.
Если 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/3.0.x/serving/