Spec-Zone.ru › Werkzeug 2.2

Отображение 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 (Optional[Iterable[str]]) – Перезагрузчик будет следить за этими файлами на предмет изменений помимо файлов Python-модулей. Например, отслеживание файла конфигурации.
  • exclude_patterns (Optional[Iterable[str]]) – Перезагрузчик будет игнорировать изменения в любых файлах, соответствующих этим шаблонам fnmatch. Например, игнорирование файлов кеша.
  • reloader_interval (int) – Частота проверки перезагрузчика на предмет изменений.
  • reloader_type (str) – Используемый перезагрузчик. Встроенный перезагрузчик 'stat' , но может потребовать значительных ресурсов процессора для отслеживания файлов. Перезагрузчик 'watchdog' намного эффективнее, но для его использования необходимо предварительно установить пакет watchdog.
  • threaded (bool) – Обработка одновременных запросов с помощью потоков. Не может быть использовано с processes.
  • processes (int) – Обработка одновременных запросов с использованием до этого количества процессов. Не может быть использовано с threaded.
  • request_handler (Optional[Type[WSGIRequestHandler]]) – Использовать другой BaseHTTPRequestHandler подкласс для обработки запросов.
  • static_files (Optional[Dict[str, Union[str, Tuple[str, str]]]]) – Словарь, сопоставляющий префиксы URL с каталогами для обслуживания статических файлов с помощью SharedDataMiddleware.
  • passthrough_errors (bool) – Не перехватывать необработанные исключения на уровне сервера, позволить серверу завершиться вместо этого. Если use_debugger включено, отладчик по-прежнему будет перехватывать такие ошибки.
  • ssl_context (Optional[Union[ssl.SSLContext, Tuple[str, Optional[str]], te.Literal['adhoc']]]) – Настройка 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 (Optional[str]) – имя хоста. Его можно использовать как альтернативу для cn.
  • cn (Optional[str]) – используемое 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' устанавливает его на стандартное базированное на stat опроса, а 'watchdog' принудительно переключает его на бэкэнд watchdog.

Примечание

Некоторые специфические случаи, такие как модули, которые не удалось импортировать, не обрабатываются релоадером stat по соображениям производительности. Релоадер watchdog отслеживает и такие файлы.

Цветной логгинг

Сервер разработки выделяет записи запросов разными цветами в зависимости от кода состояния. В Windows для включения этой функции также необходимо установить Colorama.

Виртуальные хосты

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

Это позволяет называть ваш локальный компьютер yourapplication.local и api.yourapplication.local (или что-то ещё) в дополнение к localhost.

Вы можете найти файл hosts по следующим путям:

Windows

%SystemRoot%\system32\drivers\etc\hosts

Linux/macOS

/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-системы, macOS 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

Временные сертификаты

Самый простой способ включить 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–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.2.x/serving/

Spec-Zone.ru

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