La Interfaz de puerta de enlace del servidor web ( WSGI , que se pronuncia whisky [1] [2] o WIZ -ghee [3] ) es una convención de llamada simple para que los servidores web envíen solicitudes a aplicaciones web o marcos escritos en el lenguaje de programación Python . La versión actual de WSGI, versión 1.0.1, se especifica en Python Enhancement Proposal (PEP) 3333. [4]
WSGI se especificó originalmente como PEP-333 en 2003. [5] PEP-3333, publicado en 2010, actualiza la especificación para Python 3 .
Fondo
En 2003, los marcos web de Python generalmente se escribían solo contra CGI , FastCGI , mod_python o alguna otra API personalizada de un servidor web específico . [6] Para citar PEP 333:
Python actualmente cuenta con una amplia variedad de marcos de aplicaciones web, como Zope, Quixote, Webware, SkunkWeb, PSO y Twisted Web, por nombrar solo algunos. Esta amplia variedad de opciones puede ser un problema para los nuevos usuarios de Python, porque en general, su elección de marco web limitará su elección de servidores web utilizables, y viceversa ... Por el contrario, aunque Java tiene tantos marcos de aplicaciones web disponible, la API "servlet" de Java hace posible que las aplicaciones escritas con cualquier marco de aplicación web Java se ejecuten en cualquier servidor web que admita la API de servlet.
Por lo tanto, WSGI se creó como una interfaz de implementación neutral entre servidores web y aplicaciones web o marcos para promover un terreno común para el desarrollo de aplicaciones web portátiles . [4]
Descripción general de la especificación
El WSGI tiene dos lados:
- el lado del servidor / puerta de enlace. A menudo se ejecuta un software de servidor web completo, como Apache o Nginx , o es un servidor de aplicaciones ligero que puede comunicarse con un servidor web, como flup .
- el lado de la aplicación / marco. Este es un Python invocable, proporcionado por el programa o marco de Python.
Entre el servidor y la aplicación, puede haber uno o más componentes de middleware WSGI , que implementan ambos lados de la API, generalmente en código Python.
WSGI no especifica cómo se debe iniciar el intérprete de Python, ni cómo se debe cargar o configurar el objeto de la aplicación, y diferentes marcos y servidores web logran esto de diferentes maneras.
Middleware WSGI
Un componente de middleware WSGI es un Python invocable que es en sí mismo una aplicación WSGI, pero puede manejar solicitudes delegando a otras aplicaciones WSGI. Estas aplicaciones pueden ser componentes de middleware WSGI. [7]
Un componente de middleware puede realizar funciones como: [7]
- Enrutar una solicitud a diferentes objetos de la aplicación en función de la URL de destino , después de cambiar las variables de entorno en consecuencia.
- Permitir que múltiples aplicaciones o marcos se ejecuten en paralelo en el mismo proceso
- Equilibrio de carga y procesamiento remoto, mediante el reenvío de solicitudes y respuestas a través de una red
- Realizar posprocesamiento de contenido, como aplicar hojas de estilo XSLT
Ejemplos de
Aplicación de ejemplo
Una aplicación " Hello, World! " Compatible con WSGI escrita en Python :
def aplicación ( environ , start_response ): start_response ( '200 OK' , [( 'Tipo de contenido' , 'texto / sin formato' )]) rendimiento b '¡Hola, mundo! \ n '
Dónde:
- La línea 1 define una función [8] nombrada
application
, que toma dos parámetros,environ
ystart_response
.environ
es un diccionario que contiene variables de entorno CGI , así como otros parámetros de solicitud y metadatos bajo claves bien definidas. [9]start_response
es un invocable en sí mismo, que toma dos parámetros posicionalesstatus
yresponse_headers
. - Llamadas de la línea 2
start_response
, especificando "200 OK" como estado HTTP y un encabezado de respuesta "Content-Type". - La línea 3 convierte la función en un generador . El cuerpo de la respuesta se devuelve como un iterable de cadenas de bytes .
Ejemplo de llamada a una aplicación
Un ejemplo completo de un servidor de red WSGI está fuera del alcance de este artículo. A continuación se muestra un esquema de cómo se llamaría una aplicación WSGI y recuperaría su línea de estado HTTP, encabezados de respuesta y cuerpo de respuesta, como objetos de Python. [10]environ
Se han omitido los detalles de cómo construir el dictado.
desde io importar BytesIOdef call_application ( aplicación , entorno ): estado = Ninguno encabezados = Ninguno cuerpo = BytesIO () def start_response ( rstatus , rheaders ): no local de estado , las cabeceras de estado , cabeceras = rstatus , rheaders app_iter = aplicación ( environ , start_response ) tratar : para los datos en app_iter : afirmar el estado es No Ninguno y cabeceras es no Ninguno , \ "start_response () no fue llamado" cuerpo . escribir ( datos ) finalmente : if hasattr ( app_iter , 'close' ): app_iter . close () devuelve estado , encabezados , cuerpo . getvalue ()environment = { ... } # "environment" dict status , headers , body = call_application ( aplicación , entorno )
Aplicaciones y marcos compatibles con WSGI
Numerosos marcos web admiten WSGI:
- bjoern
- BlueBream
- bobo [11]
- Botella
- CherryPy
- Django [12]
- Eventlet [13]
- Matraz
- Falcon (marco web) [14]
- Gevent-FastCGI [15]
- Webapp2 de Google App Engine
- Gunicorn
- prestans [16]
- mod_wsgi para usar con Apache [17]
- netius
- picnico [18]
- Pegar componente WebOb es específicamente una extensión WSGI. Fue adoptado por el proyecto Pylons .
- Pilones
- Pirámide
- restlite [19]
- Tornado
- Trac
- TurboGears
- Uliweb [20]
- uWSGI
- Camarera [21]
- web.py [22]
- web2py
- weblayer [23]
- Werkzeug [24]
- Radicale [25]
Actualmente, los contenedores están disponibles para FastCGI , CGI , SCGI , AJP (usando flup), twisted.web , Apache (usando mod_wsgi o mod_python ), Nginx (usando ngx_http_uwsgi_module), [26] y Microsoft IIS (usando WFastCGI, [27] isapi- wsgi, [28] PyISAPIe, [29] o una puerta de enlace ASP ).
Ver también
- ASGI : el sucesor espiritual de WSGI, que agrega soporte para aplicaciones asincrónicas
- Rack - Interfaz del servidor web Ruby
- PSGI - Interfaz de puerta de enlace del servidor web Perl
- SCGI : interfaz de puerta de enlace común simple
- JSGI : interfaz de puerta de enlace del servidor web JavaScript
Referencias
- ^ Simionato, Michele (11 de junio de 2007). "Introducción a la programación web con WSGI" .
- ^ Edge, Jake (9 de julio de 2019). "Jugando con microframeworks" . LWN .
- ^ Goldberg, Kevin (9 de mayo de 2016). "Una introducción a los servidores Python WSGI para el rendimiento | AppDynamics" . Blog de supervisión del rendimiento de aplicaciones | AppDynamics . Consultado el 20 de agosto de 2020 .
- ^ a b "PEP 3333 - Interfaz de puerta de enlace del servidor web Python v1.0.1" . Python.org . Consultado el 4 de abril de 2018 .
- ^ "PEP 333 - Interfaz de puerta de enlace del servidor web Python v1.0" . Python.org . Consultado el 4 de abril de 2018 .
- ^ "FrontPage - Python Wiki" . Python.org . Consultado el 27 de enero de 2017 .
- ^ a b "PEP 3333 - Interfaz de puerta de enlace del servidor web Python v1.0.1" . Python.org . Consultado el 4 de abril de 2018 .
- ^ es decir, "una función, método, clase o una instancia con un
__call__
método" - ^ "PEP 3333 - Interfaz de puerta de enlace del servidor web Python v1.0.1" . Python.org . Consultado el 4 de abril de 2018 .
- ^ "Creación de Middleware WSGI - Alan Christopher Thomas - Minted - PythonKC" . YouTube . 2015-08-28 . Consultado el 27 de enero de 2017 .
- ^ "プ エ ラ リ ア ジ ェ ル の 効果 は?" . Bobo.digicool.com . Consultado el 27 de enero de 2017 .
- ^ "Django sin mod_python y soporte WSGI | Weblog | Django" . Djangoproject.com . 2005-07-18 . Consultado el 27 de enero de 2017 .
- ^ "wsgi - servidor WSGI - documentación de Eventlet 0.20.1" . Eventlet.net . Consultado el 27 de enero de 2017 .
- ^ "Falcon - marco API web bare-metal para Python" . Consultado el 22 de octubre de 2017 .
- ^ "gevent-fastcgi 1.0.2.1: Índice de paquetes de Python" . Pypi.python.org . 2015-12-06 . Consultado el 27 de enero de 2017 .
- ^ "anomalía / prestans: un micro-marco REST compatible con WSGI" . GitHub.com . Consultado el 27 de enero de 2017 .
- ^ "Archivo de código de Google - almacenamiento a largo plazo para el alojamiento de proyectos de código de Google" . Code.google.com . Consultado el 27 de enero de 2017 .
- ^ "Marco Pycnic" . Pycnic.nullism.com . Consultado el 27 de enero de 2017 .
- ^ "theintencity / restlite: herramientas de servidor RESTful livianas en Python" . GitHub.com . Consultado el 27 de enero de 2017 .
- ^ "limodou / uliweb: marco web Python simple y fácil de usar" . GitHub.com . Consultado el 27 de enero de 2017 .
- ^ "documentación de camarera" . docs.pylonsproject.org . Consultado el 26 de septiembre de 2018 .
- ^ "Bienvenido a" . Web.py . 2009-09-11 . Consultado el 27 de enero de 2017 .
- ^ "weblayer - documentación de weblayer v0.4.3" . Packages.python.org . Consultado el 27 de enero de 2017 .
- ^ "Bienvenido | Werkzeug (La biblioteca de utilidades Python WSGI)" . Werkzeug.pocoo.org . Consultado el 27 de enero de 2017 .
- ^ "CalDAV y CardDAV Server: un calendario simple y un servidor de contactos" . Radicale.org . Consultado el 27 de enero de 2017 .
- ^ "Módulo ngx_http_uwsgi_module" . Nginx.org . Consultado el 27 de enero de 2017 .
- ^ "Herramientas de Python para Visual Studio - Documentación" . Pytools.codeplex.com . Consultado el 27 de enero de 2017 .
- ^ "Archivo de código de Google - almacenamiento a largo plazo para el alojamiento de proyectos de código de Google" . Code.google.com . Consultado el 27 de enero de 2017 .
- ^ "Extensión Python ISAPI para descargar IIS | SourceForge.net" . Pyisapie.sourceforge.net . 2012-04-24 . Consultado el 27 de enero de 2017 .
enlaces externos
- PEP 333 - Interfaz de puerta de enlace del servidor web Python
- PEP 3333 - Interfaz de puerta de enlace del servidor web Python v1.0.1
- Metaframework WSGI
- Wiki completo sobre todo WSGI
- Tutorial WSGI
- Módulo de biblioteca estándar de Python wsgiref
- Introducción a WSGI
- NWSGI : implementación .NET de la especificación Python WSGI para IronPython e IIS
- Servidor Gevent-FastCGI implementado utilizando la biblioteca de redes gevent basada en rutinas