Python para Desenvolvedores

2ª edição, revisada e ampliada

Capítulo 29: Web


Uma aplicação Web é uma aplicação cliente-servidor aonde o cliente é o browser (como o Mozilla Firefox) e o protocolo utilizado para a comunicação com o servidor é chamado Hypertext Transfer Protocol (HTTP), tecnologias que servem de base para a World Wide Web (WWW), as páginas de hipertexto que fazem parte da internet. Tais páginas seguem as convenções da linguagem HyperText Markup Language (HTML).

Aplicação Web

As aplicações Web geram as páginas HTML dinamicamente, atendendo as requisições enviadas pelo browser. Se construídas da forma adequada, estas aplicações podem ser acessadas em vários ambientes diferentes, de computadores pessoais, até PDAs e celulares.

Existem muitos frameworks para facilitar o desenvolvimento de aplicativos Web em Python, entre eles, o CherryPy e o CherryTemplate.

CherryPy

CherryPy é um framework para aplicações Web que publica objetos, convertendo URLs em chamadas para os métodos dos objetos publicados. Com o CherryPy, o programa passa a se comportar como um servidor Web, respondendo a requisições GET e POST.

Exemplo com CherryPy:

In [*]:
import cherrypy

class Root(object):

    @cherrypy.expose
    def index(self):

        return 'Hello World!'

cherrypy.quickstart(Root())
[16/Aug/2013:10:41:47] ENGINE Listening for SIGHUP.
[16/Aug/2013:10:41:47] ENGINE Listening for SIGTERM.
[16/Aug/2013:10:41:47] ENGINE Listening for SIGUSR1.
[16/Aug/2013:10:41:47] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.

[16/Aug/2013:10:41:47] ENGINE Started monitor thread 'Autoreloader'.
[16/Aug/2013:10:41:47] ENGINE Started monitor thread '_TimeoutMonitor'.
[16/Aug/2013:10:41:47] ENGINE Serving on 127.0.0.1:8080
[16/Aug/2013:10:41:47] ENGINE Bus STARTED

O decorador @expose indica quais métodos são publicados via Web. O retorno do método é uma string, que é enviada para o browser.

O endereço padrão do servidor é http://localhost:8080/.

CherryTemplate

CherryTemplate é um módulo de processamento de modelos (templates) para Python. Era parte integrante do CherryPy, mas hoje é distribuído como um pacote separado.

Marcadores disponíveis no CherryTemplate:

  • py-eval: avalia uma expressão em Python e insere o resultado (que deve ser uma string) no texto.

Exemplo:

Somatório de 1 a 10 é <py-eval="str(sum(range(1, 11)))">

  • py-exec: executa uma linha de código Python.

Exemplo:

<py-exec="import platform">
O sistema é <py-eval="platform.platform()">

  • py-code: executa um bloco de código Python.

Exemplo:

<py-code="
import platform
sistema = platform.platform()
">
<py-eval="sistema">

  • py-if / py-else: funciona como o par if / else em Python.

Exemplo:

<py-if="1 > 10">
    Algo errado...
</py-if><py-else>
    Correto!
</py-else>

  • py-for: funciona como o laço for em Python.

Exemplo:

<py-for="x in range(1, 11)">
    <py-eval="str(x)"> ** 2 = <py-eval="str(x ** 2)"><br>
</py-for>

  • py-include: inclui um arquivo externo no template.

Exemplo:

<py-include="header.html">
Corpo da página...
<py-include="footer.html">

Além de usar uma string como template, é possível guardar o template em um arquivo:

renderTemplate(file='index.html')

Exemplo com CherryTemplate:

In [1]:
from cherrytemplate import renderTemplate

progs = ['Yes', 'Genesis', 'King Crimson']

template = '<html>\n<body>\n'\
'<py-for="prog in progs">'\
'    <py-eval="prog"><br>\n'\
'</py-for>'\
'</body>\n</html>\n'

print renderTemplate(template)
<html>
<body>
    Yes<br>
    Genesis<br>
    King Crimson<br>
</body>
</html>

As saídas geradas pelo CherryTemplate podem ser publicadas pelo CherryPy.

Cliente Web

O Python também pode funcionar do lado cliente, através do módulo urllib.

Exemplo:

In [2]:
import urllib

# Abre a URL e fornece um objeto semelhante
# a um arquivo convencional
url = urllib.urlopen('http://ark4n.wordpress.com/')

# Lê a página
html = url.read()

#html = '<a href="http://www.gnu.org/">'
found = html.find('href=', 0)

# find retorna -1 se não encontra
while found >= 0:

    # O fim do link (quando as aspas acabam)
    end = html.find(html[found + 5], found + 6) + 1

    # Mostra o link
    print html[found:end]

    # Passa para o próximo link
    found = html.find('href=', found + 1)

Outra solução cliente é o Twisted Web, que é parte do projeto Twisted, um framework orientado a eventos voltado para protocolos de rede, incluindo HTTP, SSH, IRC, IMAP e outros.

In [1]:
 
Out[1]: