Interface de gateway do servidor web - Web Server Gateway Interface
A Web Server Gateway Interface ( WSGI , pronuncia-se whisky ou WIZ -ghee ) é uma convenção de chamada simples para servidores da web para encaminhar solicitações para aplicativos da web ou estruturas escritas na linguagem de programação Python . A versão atual do WSGI, versão 1.0.1, é especificada na Python Enhancement Proposal (PEP) 3333.
WSGI foi originalmente especificado como PEP-333 em 2003. PEP-3333, publicado em 2010, atualiza a especificação para Python 3 .
Fundo
Em 2003, as estruturas da web Python eram normalmente escritas apenas para CGI , FastCGI , mod_python ou alguma outra API personalizada de um servidor da web específico . Para citar o PEP 333:
Python atualmente possui uma ampla variedade de estruturas de aplicativos da web, como Zope, Quixote, Webware, SkunkWeb, PSO e Twisted Web - para citar apenas alguns. Essa ampla variedade de opções pode ser um problema para novos usuários de Python, porque, de modo geral, sua escolha de estrutura da web limitará a escolha de servidores da web utilizáveis e vice-versa ... Por outro lado, embora o Java tenha tantos frameworks de aplicativos da web disponível, a API de "servlet" do Java possibilita que aplicativos escritos com qualquer estrutura de aplicativo da web Java sejam executados em qualquer servidor da web que suporte a API de servlet.
WSGI foi, portanto, criado como uma interface neutra de implementação entre servidores web e aplicações web ou frameworks para promover um terreno comum para o desenvolvimento de aplicações web portáteis .
Visão geral da especificação
O WSGI tem dois lados:
- o lado do servidor / gateway. Geralmente, ele executa um software de servidor web completo, como Apache ou Nginx , ou é um servidor de aplicativos leve que pode se comunicar com um servidor web, como flup .
- o lado do aplicativo / estrutura. Este é um Python chamável, fornecido pelo programa ou framework Python.
Entre o servidor e o aplicativo, pode haver um ou mais componentes de middleware WSGI , que implementam ambos os lados da API, normalmente em código Python.
O WSGI não especifica como o interpretador Python deve ser iniciado, nem como o objeto do aplicativo deve ser carregado ou configurado, e diferentes estruturas e servidores da web fazem isso de maneiras diferentes.
Middleware WSGI
Um componente de middleware WSGI é um Python chamável que é um aplicativo WSGI, mas pode manipular solicitações delegando a outros aplicativos WSGI. Esses aplicativos podem ser componentes de middleware WSGI.
Um componente de middleware pode executar funções como:
- Encaminhar uma solicitação para diferentes objetos de aplicativo com base na URL de destino , depois de alterar as variáveis de ambiente de acordo.
- Permitir que vários aplicativos ou estruturas sejam executados lado a lado no mesmo processo
- Balanceamento de carga e processamento remoto, encaminhando solicitações e respostas em uma rede
- Executar pós-processamento de conteúdo, como aplicar folhas de estilo XSLT
Exemplos
Aplicação de exemplo
Um aplicativo " Hello, World! " Compatível com WSGI escrito em Python :
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
yield b'Hello, World!\n'
Onde:
- A linha 1 define uma função chamada
application
, que recebe dois parâmetros,environ
estart_response
.environ
é um dicionário que contém variáveis de ambiente CGI , bem como outros parâmetros de solicitação e metadados sob chaves bem definidas.start_response
é um chamável em si, tendo dois parâmetros posicionais,status
eresponse_headers
. - A linha 2 chama
start_response
, especificando "200 OK" como o status HTTP e um cabeçalho de resposta "Content-Type". - A linha 3 transforma a função em um gerador . O corpo da resposta é retornado como um iterável de strings de bytes .
Exemplo de chamada de aplicativo
Um exemplo completo de um servidor de rede WSGI está fora do escopo deste artigo. Abaixo está um esboço de como alguém chamaria um aplicativo WSGI e recuperaria sua linha de status HTTP, cabeçalhos de resposta e corpo de resposta, como objetos Python. Detalhes de como construir o environ
dicionário foram omitidos.
from io import BytesIO
def call_application(app, environ):
status = None
headers = None
body = BytesIO()
def start_response(rstatus, rheaders):
nonlocal status, headers
status, headers = rstatus, rheaders
app_iter = app(environ, start_response)
try:
for data in app_iter:
assert status is not None and headers is not None, \
"start_response() was not called"
body.write(data)
finally:
if hasattr(app_iter, 'close'):
app_iter.close()
return status, headers, body.getvalue()
environ = {...} # "environ" dict
status, headers, body = call_application(app, environ)
Aplicativos e estruturas compatíveis com WSGI
Numerosas estruturas da web suportam WSGI:
- bjoern
- BlueBream
- bobo
- Garrafa
- CherryPy
- Django
- Eventlet
- Frasco
- Falcon (estrutura da web)
- Gevent-FastCGI
- Webapp2 do Google App Engine
- Gunicorn
- prestans
- mod_wsgi para uso com Apache
- Netius
- picnic
- O componente WebOb de colagem é especificamente uma extensão WSGI. Foi adotado pelo projeto Pylons .
- Pylons
- Pirâmide
- restlite
- Tornado
- Trac
- TurboGears
- Uliweb
- uWSGI
- Garçonete
- web.py
- web2py
- camada de teia
- Werkzeug
- Radicale
Atualmente, os wrappers estão disponíveis para FastCGI , CGI , SCGI , AJP (usando flup), twisted.web , Apache (usando mod_wsgi ou mod_python ), Nginx (usando ngx_http_uwsgi_module) e Microsoft IIS (usando WFastCGI, isapi-wsgi, PyISAPIe ou an Gateway ASP ).
Veja também
- ASGI - O sucessor espiritual de WSGI, adicionando suporte para aplicativos assíncronos
- Rack - interface de servidor web Ruby
- PSGI - Interface Perl Web Server Gateway
- SCGI - Simple Common Gateway Interface
- JSGI - interface de gateway de servidor web JavaScript
Referências
links externos
- PEP 333 - Interface Python Web Server Gateway
- PEP 3333 - Interface de gateway de servidor da Web Python v1.0.1
- Metaframework WSGI
- Wiki abrangente sobre tudo WSGI
- Tutorial WSGI
- Módulo de biblioteca padrão do Python wsgiref
- Primeiros passos com WSGI
- NWSGI - implementação .NET da especificação Python WSGI para IronPython e IIS
- Servidor Gevent-FastCGI implementado usando biblioteca de rede baseada em co-rotina gevent