Что такое Werkzeug?

Из официальной документации:

Werkzeug - это библиотека утилит WSGI для Python.

Однако, когда я запускаю свое веб-приложение Flask, я замечаю, что заголовок ответа с сервера содержит:

HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Server: Werkzeug/0.11.9 Python/2.7.10
Date: Tue, 03 May 2016 12:50:08 GMT

В четвертой строке сервер упоминает Werkzeug, но что именно такое Werkzeug, это веб-сервер, как Apache?

Ответ 1

Нет, это не веб-сервер, как Apache. Это библиотека CGI. Поскольку Apache (или ваше приложение Flask), вероятно, использует библиотеку для обслуживания некоторых HTTP-запросов, он, вероятно, добавляет этот заголовок в ответ.

Ответ 2

Нет, это не

Werkzeug (библиотека WSGI) похожа на коммуникатор между вашим кодом python и сервером http nginx/apache

Вот полный пример использования Werkzeug WSGI:

WSGI имеет две стороны: "сервер" или "шлюз" (часто это веб-сервер таких как Apache или Nginx), и сторона "приложение" или "каркас" (сам Python script). Для обработки запроса WSGI серверная сторона выполняет приложение и предоставляет информацию об окружающей среде и обратного вызова на стороне приложения. Процессы приложений запрос, возвращающий ответ на серверную сторону, используя функция обратного вызова была предоставлена.

Между сервером и приложения, может существовать промежуточное ПО WSGI, которое реализует оба сторон API. Сервер получает запрос от клиента и пересылает его в промежуточное ПО. После обработки он отправляет запрос приложение. Ответ приложения отправляется промежуточное ПО на сервер и, в конечном счете, клиенту. Может быть несколько посредников, образующих стек приложений, совместимых с WSGI.

Надеюсь, что это поможет

Ответ 3

Werkzeug - это, прежде всего, библиотека, а не веб-сервер, хотя он предоставляет простой веб-сервер для целей разработки. Именно этот сервер разработки предоставляет заголовок Server:.

Чтобы перейти к более подробно:

Во-первых, давайте поговорим о WSGI. Существует множество веб-серверов, таких как Apache, Nginx, Lighttpd и т.д. Есть также несколько веб-фреймворков, написанных на Python, например. Джанго, Настой, Торнадо, Пирамида и т.д. Было бы очень удобно, если бы все они были совместимы. Вот где приходит WSGI. Идея такова:

  • При ответе на HTTP-запрос клиента участвуют две стороны: веб-сервер и веб-приложение. Сервер обрабатывает тонкости сетевых подключений, получает запрос и отправляет ответ. Приложение получает данные запроса, обрабатывает их и создает ответ для отправки сервером обратно.

  • Если вы хотите написать веб-приложение Python, убедитесь, что у него есть вызываемый объект (например, функция), который принимает определенные параметры для заголовков HTTP, данных формы ввода, переменных среды и т.д.

  • Если вы хотите написать веб-сервер, который обслуживает приложения Python, заставляйте его вызывать этот вызываемый объект из приложения каждый раз, когда поступает HTTP-запрос.

  • Спецификация WSGI (в PEP 3333) точно определяет, какими должны быть параметры для этого вызываемого объекта и какое должно быть возвращаемое значение, чтобы каждый сервер знал, как общаться с каждым приложением и наоборот.

Итак, мы знаем, что каждое веб-приложение должно предоставлять этот вызываемый объект и иметь возможность обрабатывать определенные параметры, которые оно получает. Каждое приложение должно делать это... Это звучит как хорошая возможность использовать библиотеку. Werkzeug - это библиотека.

Werkzeug предоставляет набор утилит для разработки приложений, совместимых с WSGI. Эти утилиты выполняют такие функции, как разбор заголовков, отправка и получение файлов cookie, предоставление доступа к данным формы, создание перенаправлений, создание страниц с ошибками при возникновении исключения, даже предоставление интерактивного отладчика, который запускается в браузере. Это действительно довольно всеобъемлющее. Затем Flask строится на этом фундаменте (и Jinja, Click и т.д.), Чтобы обеспечить полную веб-среду.

Итак, если Werkzeug - это библиотека для приложений, почему она отображается в заголовке сервера?

Werkzeug также имеет модуль для роли сервера. Это сделано исключительно для удобства.

Установка и настройка полноценного веб-сервера, такого как Apache или Nginx, требует больших усилий и почти наверняка излишне из-за того, что вы тестируете свое приложение на своей собственной платформе разработки. По этой причине Werkzeug предоставляет сервер разработки: простой веб-сервер, который можно запустить с помощью одной команды и практически без настройки. Когда вы делаете flask run (или werkzeug.serving.run_simple()), вы получаете именно этот сервер разработки. И заголовок Server: для сервера разработки - &— как вы уже догадались, - Werkzeug/<version> Python/<version>.

Этот сервер не предназначен для производственного использования. По крайней мере, согласно документам, он не очень хорошо масштабируется. Но я не удивлюсь, если будут и другие проблемы, такие как безопасность.

Ответ 4

Потому что это не так.

В вашей настройке вы, скорее всего, используете "сервер разработки" (функция run_simple) для тестирования. Таким образом, он используется в этом случае как (очень) бедный человек Apache, но только в том смысле, что он способен правильно отвечать на HTTP-запросы.

Если вы проверите документы http://werkzeug.pocoo.org/docs/serving/ , вы увидите следующее примечание:

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

Ответ 5

Flask Python использует Werkzeurg в качестве веб-сервера для тестирования