Развёртывание 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[werkzeug.serving.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'для генерации временного самоподписанного сертификата.
-
hostname (str) – Хост, к которому следует привязаться, например
- Тип возвращаемого значения
-
None
Изменено в версии 2.1: Показать инструкции по обработке ошибки «адрес уже используется».
Изменено в версии 2.1: Запуск на
0.0.0.0или::отображает петлевой IP-адрес помимо реального 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' устанавливает его в режим по умолчанию (polling на основе 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–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.1.x/serving/