Web Server Gateway Interface

O Web Server Gateway Interface (WSGI), em português Interface de Porta de Entrada do Servidor Web, é uma especificação para uma interface simples e universal entre servidores web e aplicações web ou frameworks para a linguagem de programação Python. Foi originalmente especificada na PEP 333, de autoria de Philip J. Eby, e publicada em 7 de dezembro de 2003.[1] Desde então foi adotada como um padrão para o desenvolvimento de aplicações web em Python. A última versão da especificação é v1.0.1, também conhecida como PEP 3333, publicada em 26 de setembro de 2010.[2]

Ideia

Frameworks de aplicação web em Python têm sido um problema para novos usuários de Python pois a escolha do framework web pode limitar a escolha de servidores web úteis, e vice-versa.

Aplicações em Python eram frequentemente projetadas para apenas um dos servidores CGI, FastCGI, mod_python ou alguma outra API personalizada de um servidor web específico.

O WSGI foi criado como uma interface de baixo-nível entre servidores web e aplicações web ou frameworks para promover uma base comum para o desenvolvimento de aplicações web portáteis.

Visão geral da especificação

O WSGI possui dois lados: o lado "servidor" ou "gateway" e o lado "aplicação" ou "framework". Para processar uma requisição WSGI, o lado servidor fornece informações de ambiente e uma função de callback para o lado aplicação. A aplicação processa a requisição e retorna a resposta para o lado servidor usando a função de callback que o lado servidor forneceu.

O chamado middleware WSGI implementa os dois lados da API, desta forma ele pode intermediar entre um servidor WSGI e uma aplicação WSGI: o middleware age como uma aplicação de algum ponto de vista do servidor WSGI e como um servidor de algum ponto de vista da aplicação WSGI. Um componente "middleware" pode realizar funções como:

  • Rotear uma requisição para diferentes objetos da aplicação baseados na URL alvo, após mudar as variáveis de ambiente adequadamente.
  • Permitir várias aplicações ou frameworks executarem lado a lado no mesmo processo
  • Balanceamento de carga e processamento remoto, enviando requisições e respostas sobre uma rede
  • Realizar pós-processamento de conteúdo, como aplicar folhas de estilo XSLT

Aplicação de exemplo

Uma aplicação "Olá Mundo" compatível com WSGI escrita em Python:

def aplicacao(ambiente, resposta_inicio):
    resposta_inicio('200 OK', [('Content-Type', 'text/plain')])
    yield 'Olá Mundo\n'

Onde:

  • Linha 1 define um "chamável" denominado aplicacao, que leva dois parâmetros, ambiente e resposta_inicio. ambiente é um dicionário contendo variáveis de ambiente em CGI. resposta_inicio é um "chamável" que leva dois parâmetros necessários estado e cabecalhos_resposta.
  • Linha 2 chama resposta_inicio, especificando "200 OK" como o estado e o cabeçalho "Content-Type".
  • Linha 3 retorna o corpo de resposta como um literal string.

Aplicações e frameworks compatíveis com WSGI

Há vários frameworks de aplicação web que suportam WSGI:

Servidores que suportam WSGI

Esta é uma lista de servidores WSGI. Em alguns casos são apenas sistemas WSGI, em outros um pacote que inclui um servidor.

  • ajp-wsgi
  • Aspen[12]
  • cherrypy.wsgiserver
  • chiral.web.httpd
  • cogen.web.wsgi
  • FAPWS
  • fcgiapp
  • flup[13]
  • gevent-fastcgi
  • Gunicorn
  • ISAPI-WSGI
  • James
  • Julep
  • m2twisted
  • modjy
  • mod_wsgi
  • NWSGI
  • paste.httpserver
  • phusion passenger
  • python-fastcgi
  • Spawning
  • twisted.web
  • uWSGI
  • werkzeug.serving
  • wsgid
  • WSGIUtils
  • wsgiref (Python 3)

Ligações externas

  • Site web oficial da documentação do WSGI

Referências

  1. «PEP 333, Python Web Server Gateway Interface v1.0» 
  2. «PEP 3333, Python Web Server Gateway Interface v1.0.1» 
  3. «Bobo light-weight framework for creating WSGI web applications» 
  4. «Bottle Micro-Framework» 
  5. «Django with WSGI support» 
  6. «prestans Micro-Framework» 
  7. «restlite server tools for quick prototyping» 
  8. «Ulibweb github source code» 
  9. «web.py official site» 
  10. «weblayer package for writing WSGI application» 
  11. «Werkzeug, the Python WSGI Utility Library» 
  12. http://aspen.io/
  13. https://www.saddi.com/software/flup/