Convención de llamada para que los servidores web reenvíen solicitudes a aplicaciones web escritas en Python
La interfaz de puerta de enlace del servidor web ( WSGI , pronunciada whiskey [1] [2] o WIZ -ghee [3] ) es una convención de llamada simple para que los servidores web reenvíen solicitudes a aplicaciones web o marcos escritos en el lenguaje de programación Python . La versión actual de WSGI, la versión 1.0.1, se especifica en la Propuesta de mejora de Python (PEP) 3333. [4]
WSGI se especificó originalmente como PEP-333 en 2003. [5] PEP-3333, publicada en 2010, actualiza la especificación para Python 3 .
Fondo
En 2003, los marcos web de Python generalmente se escribían solo para CGI , FastCGI , mod_python o alguna otra API personalizada de un servidor web específico . [6] Para citar PEP 333:
Python cuenta actualmente 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 términos generales, su elección de marco de aplicaciones web limitará su elección de servidores web utilizables, y viceversa... Por el contrario, aunque Java tiene tantos marcos de aplicaciones web disponibles, la API de "servlet" de Java permite que las aplicaciones escritas con cualquier marco de aplicaciones web de Java se ejecuten en cualquier servidor web que admita la API de servlet.
De este modo, WSGI se creó como una interfaz neutral en cuanto a la implementación entre servidores web y aplicaciones o marcos web para promover un terreno común para el desarrollo de aplicaciones web portátiles . [4]
Descripción general de las especificaciones
El WSGI tiene dos caras:
- El lado del servidor o la puerta de enlace. Suele ejecutarse un software de servidor web completo, como Apache o Nginx , o es un servidor de aplicaciones liviano que puede comunicarse con un servidor web, como flup.
- El lado de la aplicación o del marco de trabajo. Se trata de un objeto invocable de Python, proporcionado por el programa o el marco de trabajo 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 debe iniciarse el intérprete de Python ni cómo debe cargarse o configurarse el objeto de la aplicación, y los distintos marcos y servidores web logran esto de diferentes maneras.
Middleware WSGI
Un componente de middleware WSGI es un elemento invocable de Python que es en sí mismo una aplicación WSGI, pero que puede gestionar solicitudes delegándolas a otras aplicaciones WSGI. Estas aplicaciones pueden ser en sí mismas componentes de middleware WSGI. [7]
Un componente de middleware puede realizar funciones como: [7]
- Enrutar una solicitud a diferentes objetos de aplicación según la URL de destino , después de cambiar las variables de entorno en consecuencia.
- Permitir que varias 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
Ejemplo de aplicación
Una aplicación " ¡Hola, mundo! " compatible con WSGI escrita en Python :
def aplicación ( entorno , 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] denominada
application
, que toma dos parámetros, environ
y start_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 objeto invocable en sí mismo, que toma dos parámetros posicionales, status
y response_headers
. - La línea 2 llama
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 queda fuera del alcance de este artículo. A continuación se muestra un esquema de cómo se llamaría a una aplicación WSGI y se recuperaría su línea de estado HTTP, encabezados de respuesta y cuerpo de respuesta como objetos Python. [10]environ
Se han omitido los detalles de cómo construir el diccionario.
desde io importar BytesIOdef call_application ( app , environ ): estado = Ninguno encabezados = Ninguno cuerpo = BytesIO () def start_response ( rstatus , rheaders ): estado no local , estado de los encabezados , encabezados = rstatus , rheaders app_iter = app ( environ , start_response ) try : para los datos en app_iter : afirmar que el estado no es None y los encabezados no son None , \ " start_response () no fue llamado" body.write ( data ) finally : if hasattr ( app_iter , 'close' ) : app_iter.close ( ) return status , headers , body.getvalue ( ) entorno = { ... } # "entorno" dict estado , encabezados , cuerpo = call_application ( app , entorno )
Aplicaciones y marcos compatibles con WSGI
Numerosos marcos web admiten WSGI:
Actualmente, hay envoltorios disponibles para FastCGI , CGI , SCGI , AJP (usando flup), twisted.web , Apache (usando mod_wsgi o mod_python ), Nginx (usando ngx_http_uwsgi_module), [26] Nginx Unit (usando el módulo de lenguaje Python), [27] y Microsoft IIS (usando WFastCGI, [28] isapi-wsgi, [29] PyISAPIe, [30] o una puerta de enlace ASP ).
Véase también
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). "Introducción a los servidores WSGI de Python para mejorar el rendimiento | AppDynamics". Blog de supervisión del rendimiento de aplicaciones | AppDynamics . Consultado el 20 de agosto de 2020 .
- ^ ab "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 - Wiki de Python". Python.org . Consultado el 27 de enero de 2017 .
- ^ ab "PEP 3333 -- Interfaz de puerta de enlace de servidor web Python v1.0.1". Python.org . Consultado el 4 de abril de 2018 .
- ^ ie "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 . 28 de agosto de 2015. Archivado desde el original el 12 de diciembre de 2021 . 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 2017-01-27 .
- ^ "wsgi – Servidor WSGI — Documentación de Eventlet 0.20.1". Eventlet.net . Consultado el 27 de enero de 2017 .
- ^ "Falcon - Framework de 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 2017-01-27 .
- ^ "anomaly/prestans: Un micro-framework 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 .
- ^ "Pycnic Framework". 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: Un framework web de Python fácil y sencillo de usar". GitHub.com . Consultado el 27 de enero de 2017 .
- ^ "documentación de la camarera". docs.pylonsproject.org . Consultado el 26 de septiembre de 2018 .
- ^ "Bienvenido a". Web.py . 2009-09-11 . Consultado el 2017-01-27 .
- ^ "weblayer — documentación de weblayer v0.4.3". Packages.python.org . Consultado el 27 de enero de 2017 .
- ^ "Bienvenido | Werkzeug (La biblioteca de utilidades WSGI de Python)". Werkzeug.pocoo.org . Consultado el 27 de enero de 2017 .
- ^ "Servidor CalDAV y CardDAV: un servidor sencillo de calendario y 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 .
- ^ "Configuración: Unidad NGINX". Unit.nginx.org . Consultado el 4 de mayo de 2023 .
- ^ "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 .
- ^ "Descarga de la extensión ISAPI de Python para IIS | SourceForge.net". Pyisapie.sourceforge.net . 2012-04-24 . Consultado el 2017-01-27 .
Enlaces externos
- PEP 333 – Interfaz de puerta de enlace de servidor web Python
- PEP 3333 – Interfaz de puerta de enlace del servidor web Python v1.0.1
- Metamarco WSGI
- Wiki completa sobre todo lo relacionado con WSGI
- Tutorial de WSGI
- Módulo wsgiref de la biblioteca estándar de Python
- Introducción a WSGI
- NWSGI: implementación .NET de la especificación WSGI de Python para IronPython e IIS
- Servidor Gevent-FastCGI implementado mediante la biblioteca de redes basada en corrutinas de Gevent