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:

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 e start_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 e response_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:

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

Referências

links externos