Spec-Zone.ru › Werkzeug 0.15

Обслуживание WSGI-приложений

Существует множество способов обслуживания WSGI-приложения. Во время разработки обычно не нужно использовать полнофункциональный веб-сервер, такой как Apache, а вместо этого — простой автономный. По этой причине Werkzeug поставляется со встроенным сервером разработки.

Самый простой способ — создать небольшой start-myproject.py файл, который запускает приложение с помощью встроенного сервера:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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, reloader_interval=1, reloader_type='auto', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None)

Запуск WSGI-приложения. Дополнительные возможности включают поддержку релоадера, многопоточности и форка.

Эта функция также имеет командную строку:

python -m werkzeug.serving --help

Новая в версии 0.5: static_files был добавлен для упрощения обслуживания статических файлов, а также passthrough_errors.

Новая в версии 0.6: была добавлена поддержка SSL.

Новая в версии 0.8: Добавлена поддержка автоматической загрузки SSL-контекста из файла сертификата и закрытого ключа.

Новая в версии 0.9: Добавлена командная строка.

Новая в версии 0.10: Улучшен релоадер и добавлена поддержка изменения бэкенда через параметр reloader_type. Более подробная информация представлена в разделе Релоадер.

Изменено в версии 0.15: Связь с Unix-сокет производится путём передачи пути, начинающегося с unix:// в качестве hostname.

Параметры:
  • hostname – Хост для привязки, например 'localhost'. Если значение представляет собой путь, начинающийся с unix://, будет произведена привязка к Unix-сокету вместо TCP-сокету.
  • port – Порт для сервера. Пример: 8080
  • application – WSGI-приложение для выполнения
  • use_reloader – должен ли сервер автоматически перезапускать процесс Python, если были изменены модули?
  • use_debugger – использовать ли систему отладки Werkzeug?
  • use_evalex – следует ли включить функцию оценки исключений?
  • extra_files – список файлов, которые релоадер должен отслеживать дополнительно к модулям. Например, файлы конфигурации.
  • reloader_interval – интервал релоадера в секундах.
  • reloader_type – тип релоадера для использования. По умолчанию используется автоматическое определение. Допустимые значения: 'stat' и 'watchdog'. Более подробная информация представлена в разделе Релоадер.
  • threaded – обрабатывать ли каждый запрос в отдельном потоке?
  • processes – если больше 1, обрабатывать ли каждый запрос в новом процессе до максимального количества одновременных процессов.
  • request_handler – необязательный параметр, который может быть использован для замены стандартного. Вы можете использовать его для замены на другой BaseHTTPRequestHandler подкласс.
  • static_files – список или словарь путей для статических файлов. Работает точно так же, как SharedDataMiddleware, фактически просто обертывает приложение в этот middleware перед обслуживанием.
  • passthrough_errors – установите это в значение True для отключения обработки ошибок. Это означает, что сервер завершится при возникновении ошибок, но это может быть полезно для подключения отладчиков (pdb и т. д.)
  • ssl_context – SSL-контекст для соединения. Либо ssl.SSLContext, кортеж в формате (cert_file, pkey_file), строка 'adhoc' (если сервер должен автоматически создать контекст) или None (для отключения SSL, что является значением по умолчанию).
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.

Параметры:
  • base_path – путь к сертификату и ключу. Расширение .crt добавляется для сертификата, .key — для ключа.
  • host – имя хоста. Может быть использовано как альтернатива cn.
  • cn – используемый CN.

Информация

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

Релоадер

Изменено в версии 0.10.

Релоадер Werkzeug постоянно отслеживает модули и пути вашего веб-приложения и перезапускает сервер, если какой-либо из отслеживаемых файлов изменяется.

С версии 0.10 релоадер поддерживает два бэкенда: stat и watchdog.

  • Бэкенд по умолчанию stat просто проверяет mtime всех файлов с регулярным интервалом. Этого достаточно для большинства случаев, но известно, что он сильно разряжает батарею ноутбука.
  • Бэкенд watchdog использует события файловой системы и значительно быстрее, чем stat. Он требует установки модуля watchdog. Рекомендуемый способ — добавить Werkzeug[watchdog] в файл requirements.

Если watchdog установлен и доступен, он будет автоматически использован вместо встроенного релоадера stat.

Для переключения между бэкендами можно использовать параметр reloader_type функции run_simple(). 'stat' устанавливает его на значения по умолчанию (основанный на проверке статуса), а 'watchdog' принудительно переключает на бэкенд watchdog.

Примечание

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

Цветной вывод логов

Werkzeug способен красить вывод логов запросов при запуске из терминала, достаточно установить пакет termcolor. Пользователям 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.

Остановка сервера

Новая в версии 0.7.

Начиная с Werkzeug 0.7, сервер разработки предоставляет возможность остановить сервер после запроса. В настоящее время это работает только с Python 2.6 и выше и только с сервером разработки. Для инициализации остановки нужно вызвать функцию с именем 'werkzeug.server.shutdown' в среде WSGI:

def shutdown_server(environ):
    if not 'werkzeug.server.shutdown' in environ:
        raise RuntimeError('Not running the development server')
    environ['werkzeug.server.shutdown']()

Устранение неполадок

На операционных системах, поддерживающих 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'))
    

Вам нужно будет подтвердить сертификат в вашем браузере один раз.

Загрузка контекстов вручную

В Python 2.7.9 и 3+ у вас также есть возможность использовать объект ssl.SSLContext вместо простой кортежи. Таким образом, у вас будет больший контроль над поведением SSL встроенного сервера Werkzeug:

import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
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-сертификаты не рекомендуются, потому что современные браузеры плохо справляются с их поддержкой по соображениям безопасности.

Для этой функции требуется установить библиотеку pyOpenSSL.

Сокеты Unix

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

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

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

Spec-Zone.ru

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