Este artigo é um primeiro passo para quem quer testar e experimentar a especificação WSGI. Indicado para quem está querendo entender como servir páginas HTML com Python.

Iremos configurar o Apache para executarmos script Python utilizando o WSGI. Não é necessário, mas seria bom se você entendesse bem o que é o Arquivo hosts (/etc/hosts) e tivesse experiência prévia sobre como configurar Virtual Hosts no Apache.

O objetivo e acessarmos o endereço www.foo.local/wsgi-bin e encontramos o resultado de nossos script em CGI na pasta /pasta/de/projetos/foo/wsgi-bin/.

O que é WSGI ?

WSGI é um acrônimo para Web Server Gateway Interface, trata-se de uma forma para servidores conversarem com frameworks, e vice-versa.

"wsgi"

O que o WSGI NÂO é…

Não é mais um framework web em Python, nem é uma especificação enorme e assustadora que deve ser evitada a todo custo.


Fontes

Instalando o WSGI

Esta receita de instalação foi testada em um Linux Debian (whezzy).

Primeiro vamos atualizar seu sistema.

apt-get update
apt-get upgrade

Você precisará ter o Apache devidamente instalado, mas caso queira fazer isso rapidamente, execute o comando abaixo.

apt-get install apache2

Antes de instalar o mod_wsgi, instale a biblioteca de desenvolvimento do Phyton com o comando abaixo.

apt-get install python-setuptools

Agora, basta instalar o mod_wsgi.

apt-get install libapache2-mod-wsgi

Configurando o Apache

Nossa estrutura de arquivos será parecida com a seguinte.

/projetos/
    /foo/
        /wsgi-bin/
            index.py

OK, primeiro, precisamos incluir a seguinte linha no arquivo /etc/hots:

127.0.0.1 www.foo.local

Segundo, criaremos o seguinte Virtual Host:

<VirtualHost *:80>
    ServerName www.foo.local
    DocumentRoot /home/flavio/projetos/foo

    WSGIDaemonProcess testando-wsgi threads=5
    WSGIScriptAlias /wsgi-bin /home/flavio/projetos/foo/wsgi-bin/

    <Directory /home/flavio/projetos/foo>
        WSGIProcessGroup testando-wsgi
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Como dito, eu estou utilizando o Debian (whezzy) como sistema, se você estiver na família HedHat terá que adequar as configurações para sua distro.

Continuando, na pasta /etc/apache2/sites-available crie um arquivo denominado foo.local e insira o Virtual Host apresentado acima.

Terceiro, habilite o Virtual Host com o comando a2ensite:

#
# vá até a pasta `sites-available`
#
cd /etc/apache2/sites-available

#
# habilite o virtual host
#
a2ensite teste-wsgi

Quarto e último, reinicie o Apache para que as alterações tenha efeito (service apache2 reload).

Infelizmente, a configuração pode não ser tão simples assim, veja as matérias abaixo para entender, de forma detalhada, o que você deve fazer para configurar corretamente o servidor web.

Exemplos de arquivos WSGI escritos em Python

Primeiro exemplo

Vamos começar com um exemplo bem simples.

#!/usr/bin/python

print "Content-Type: text/plain"
print
print "hello world."

Crie um arquivo denominado primeiro-exemplo.py na pasta /pasta/de/projetos/foo/wsgi-bin/ e acesse a URL www.foo.local/wsgi-bin/primeiro-exemplo.py. Porém, antes de testar no navegador, experimente executar o script no terminal python primeiro-exemplo.py

Se, no navegador, você se deparar com o erro “Internal Server Error”, experimente ver os logs do Apache executando um dos comandos abaixo.

#
# família HedHat:
#
tail /var/log/httpd/error_log

#
# família Debian:
#
tail /var/log/apache2/error.log

Segundo exemplo

Abaixo, vemos um segundo exemplo igualmente simples de script WSGI escrito em Python.

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World!']

Crie um arquivo denominado segundo-exemplo.py na pasta /pasta/de/projetos/foo/wsgi-bin/ e acesse a URL www.foo.local/wsgi-bin/segundo-exemplo.py.

Terceiro exemplo

Aqui temos o terceiro exemplo de script WSGI escrito em Python.

Fizemos poucas alterações em relação ao segundo exemplo.

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Crie um arquivo denominado terceiro-exemplo.py na pasta /pasta/de/projetos/foo/wsgi-bin/ e acesse a URL www.foo.local/wsgi-bin/terceiro-exemplo.py.

Veja Também

Na seção Python (atual):

Na seção Miscellaneous: