# 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. 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.

## 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:
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:
* BlueBream
* bobo
* Bottle
* CherryPy
* Django
* Flask
* Google App Engine's webapp2
* Gunicorn
* prestans
* Pylons
* Pyramid
* restlite
* Tornado
* Trac
* TurboGears
* Uliweb
* web.py
* web2py
* weblayer
* Werkzeug

## 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
* cherrypy.wsgiserver
* chiral.web.httpd
* cogen.web.wsgi
* FAPWS
* fcgiapp
* flup
* 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)