|
| 1 | +# pyEchoNext / устройство веб-фреймворков |
| 2 | + |
| 3 | +Наиболее важными частями веб-фрейморков являются: |
| 4 | + |
| 5 | + + Обработчики маршрутизации (routes): |
| 6 | + - Простые: `/index` |
| 7 | + - Параметризованные: `/article/{article_id}` |
| 8 | + + Обработчики запросов (views, handlers). |
| 9 | + |
| 10 | +Основное требование: веб-фреймворк должен поддерживаться быстрым, легким и эффективным сервером (например gunicorn). Для этого в Python есть руководство по WSGI. |
| 11 | + |
| 12 | +## Устройство веб-сервера на Python |
| 13 | + |
| 14 | +``` |
| 15 | + ЗАПРОС |
| 16 | +CLIENT <--------------> [HTTP (80) или HTTPS (443)] Сервер |
| 17 | + ОТВЕТ |
| 18 | + |
| 19 | + > Приложение с логикой |
| 20 | + > Преобразование данных для python-приложения <-- Зона интересов веб-фреймвока (обеспечение работы gunicorn с ним) |
| 21 | + > Gunicorn |
| 22 | + > Преобразованные данные |
| 23 | +СЕРВЕР -> NGINX |
| 24 | + > Маршрутизация данных |
| 25 | +``` |
| 26 | + |
| 27 | +При разработки web-приложения на python мы сталкиваемся со следующими проблемами: |
| 28 | + |
| 29 | + + Многие фреймворки (ex. django) не умеют маршрутизировать ответные запросы. |
| 30 | + + Приложения являются небезопасными, и могут быть подвержены DDoS-атаке (Distributed Denial of Service, распределенный отказ в обслуживании). |
| 31 | + + Нет балансировки нагрузки между несколькими серверами. |
| 32 | + + Проблему балансировки нагрузки решает NGINX, но он не умеет запускать и общаться с Python-приложениями. |
| 33 | + |
| 34 | +Поэтому и возникает нужда в использовании WSGI-сервера (Web Server Gateway Interface) и прокси-сервера (такого как NGINX). |
| 35 | + |
| 36 | +## WSGI |
| 37 | +В настоящее время Python может похвастаться широким спектром фреймворков веб-приложений, таких как Zope, Quixote, Webware, SkunkWeb, PSO и Twisted Web — вот лишь некоторые из них. Такое широкое разнообразие вариантов может стать проблемой для новых пользователей Python, поскольку, как правило, их выбор веб-фреймворка ограничит их выбор используемых веб-серверов, и наоборот. |
| 38 | + |
| 39 | +Напротив, хотя Java имеет столько же доступных фреймворков веб-приложений, API «servlet» Java позволяет приложениям, написанным с помощью любого фреймворка веб-приложений Java, работать на любом веб-сервере, который поддерживает API сервлетов. |
| 40 | + |
| 41 | +Доступность и широкое использование такого API в веб-серверах для Python — независимо от того, написаны ли эти серверы на Python (например, Medusa), встроен ли Python (например, mod_python) или вызывают Python через протокол шлюза (например, CGI, FastCGI и т. д.) — отделит выбор фреймворка от выбора веб-сервера, позволяя пользователям выбирать подходящую им пару, в то же время освобождая разработчиков фреймворка и сервера для сосредоточения на их предпочтительной области специализации. |
| 42 | + |
| 43 | +Таким образом, этот PEP предлагает простой и универсальный интерфейс между веб-серверами и веб-приложениями или фреймворками: интерфейс шлюза веб-сервера Python (WSGI). |
| 44 | + |
| 45 | +Но само существование спецификации WSGI ничего не делает для решения существующего состояния серверов и фреймворков для веб-приложений Python. Авторы и сопровождающие серверов и фреймворков должны фактически реализовать WSGI, чтобы это имело какой-либо эффект. |
| 46 | + |
| 47 | +Однако, поскольку ни один из существующих серверов или фреймворков не поддерживает WSGI, автор, который реализует поддержку WSGI, не получит немедленного вознаграждения.Таким образом, WSGI должен быть прост в реализации, чтобы первоначальные инвестиции автора в интерфейс могли быть достаточно низкими. |
| 48 | + |
| 49 | +Таким образом, простота реализации как на стороне сервера, так и на стороне фреймворка интерфейса абсолютно критична для полезности интерфейса WSGI и, следовательно, является основным критерием для любых проектных решений. |
| 50 | + |
| 51 | +Однако следует отметить, что простота реализации для автора фреймворка — это не то же самое, что простота использования для автора веб-приложения. WSGI представляет абсолютно «без излишеств» интерфейс для автора фреймворка, потому что такие навороты, как объекты ответа и обработка файлов cookie, просто помешают существующим фреймворкам решать эти проблемы. Опять же, цель WSGI — облегчить простое взаимодействие существующих серверов и приложений или фреймворков, а не создать новый веб-фреймворк. |
| 52 | + |
| 53 | +Также следует отметить, что эта цель не позволяет WSGI требовать ничего, что еще не доступно в развернутых версиях Python. Поэтому новые модули стандартной библиотеки не предлагаются и не требуются этой спецификацией, и ничто в WSGI не требует версии Python выше 2.2.2. (Однако было бы неплохо, чтобы будущие версии Python включали поддержку этого интерфейса в веб-серверах, предоставляемых стандартной библиотекой.) |
| 54 | + |
| 55 | +Помимо простоты реализации для существующих и будущих фреймворков и серверов, также должно быть легко создавать препроцессоры запросов, постпроцессоры ответов и другие компоненты «промежуточного программного обеспечения» на основе WSGI, которые выглядят как приложение для своего содержащего сервера, при этом выступая в качестве сервера для своих содержащихся приложений.Если промежуточное ПО может быть одновременно простым и надежным, а WSGI широко доступен в серверах и фреймворках, это допускает возможность совершенно нового типа фреймворка веб-приложений Python: состоящего из слабосвязанных компонентов промежуточного ПО WSGI. Действительно, существующие авторы фреймворков могут даже выбрать рефакторинг существующих служб своих фреймворков, чтобы они предоставлялись таким образом, становясь больше похожими на библиотеки, используемые с WSGI, и меньше на монолитные фреймворки. Это тогда позволило бы разработчикам приложений выбирать «лучшие в своем классе» компоненты для определенной функциональности, вместо того, чтобы брать на себя все плюсы и минусы одного фреймворка. |
| 56 | + |
| 57 | +Конечно, на момент написания этой статьи этот день, несомненно, довольно далек. В то же время, это является достаточной краткосрочной целью для WSGI, чтобы обеспечить использование любого фреймворка с любым сервером. |
| 58 | + |
| 59 | +Наконец, следует упомянуть, что текущая версия WSGI не предписывает какой-либо конкретный механизм для «развертывания» приложения для использования с веб-сервером или серверным шлюзом. В настоящее время это обязательно определяется реализацией сервера или шлюза. После того, как достаточное количество серверов и фреймворков внедрит WSGI для обеспечения практического опыта с различными требованиями к развертыванию, может иметь смысл создать еще один PEP, описывающий |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +[Содержание](./index.md) |
0 commit comments