Spec-Zone.ru › Werkzeug 2.3

Обслуживание 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' для генерации временного самоподписанного сертификата.
Тип возвращаемого значения:

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.

Тип возвращаемого значения:

bool

END_OF_DOCUMENT_MARKER
werkzeug.serving.make_ssl_devcert(base_path, host=None, cn=None)

Создаёт SSL-ключ для разработки. Это следует использовать вместо 'adhoc' ключа, который генерирует новый сертификат при каждом запуске сервера. Он принимает путь для хранения ключа и сертификата, а также имя хоста или CN. Если указан хост, будет использовано значение CN *.host/CN=host.

Дополнительную информацию см. в run_simple().

Журнал изменений

Новая функция в версии 0.9.

Параметры:
  • base_path (str) – путь к сертификату и ключу. Расширение .crt добавляется для сертификата, .key добавляется для ключа.
  • host (str | None) – имя хоста. Это можно использовать как альтернативу для cn.
  • cn (str | None) – используемое CN.
Тип возвращаемого значения:

tuple[str, str]

Информация

Сервер разработки не предназначен для использования в производственных системах. Он был разработан специально для целей разработки и плохо работает при высокой нагрузке. Для развертывания обратитесь к страницам Развёртывание в производство.

Релоадер

Журнал изменений

Изменено в версии 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

%SystemRoot%\system32\drivers\etc\hosts

Linux / OS X

/etc/hosts

Вы можете открыть его в вашем любимом текстовом редакторе и добавить новое имя после 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.

  1. Сгенерируйте 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')
    
  2. Теперь эту кортеж можно передать как 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

Ad-hoc сертификаты

Самый простой способ включить SSL — запустить сервер в режиме ad-hoc. В этом случае Werkzeug сгенерирует для вас SSL-сертификат:

run_simple('localhost', 4000, application,
           ssl_context='adhoc')

Конечно, недостаток этого заключается в том, что вам нужно будет подтвердить сертификат каждый раз, когда сервер перезапускается. Ad-hoc сертификаты не рекомендуются, поскольку современные браузеры плохо справляются с их поддержкой по соображениям безопасности.

Для работы этой функции необходимо установить библиотеку cryptography.

Unix-сокеты

Сервер разработки может привязаться к Unix-сокету вместо TCP-сокета. run_simple() будет привязываться к Unix-сокету, если параметр hostname начинается с 'unix://'.

from werkzeug.serving import run_simple
run_simple('unix://example.sock', 0, app)

© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.3.x/serving/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API