Spec-Zone.ru › Werkzeug 3.0

Обслуживание 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

Сертификаты 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/

Spec-Zone.ru

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