Programação Orientada a Objetos com Python

A programação para Web ganha cada vez mais espaço nesse imenso mercado virtual. As linguagens de programação estão mais poderosas e ao mesmo tempo produtivas e com excelente desempenho. Neste artigo mostraremos o poder do Python rodando com o servidor Web Apache na geração de páginas dinâmicas. Utilizaremos neste artigo o Python via CGI (Common Gateway Interface) apesar de existirem outras soluções de integração dessas tecnologias.

Como exemplo, teremos um cadastro de produtos de supermercado que povoará uma tabela do Banco de Dados MySQL.

A linguagem Python foi criada em 1991 por Guido Van Rossum com muitas características da linguagem ABC. Ela é orientada a objetos, interpretada e interativa. Sua característica marcante é o controle de bloco por indentação sem a necessidade de símbolos delimitadores e códigos bastante legíveis. Extensível para C/C++ em caso de acessos a bibliotecas construídas nessas linguagens.

Download e configuração do software

Para o funcionamento do exemplo que será apresentado, instalaremos os seguintes softwares:

  • Python
  • MySQL
  • Servidor Web Apache

Você pode fazer o download do Python seguindo nossas intruções.

Inicialmente é solicitado o caminho de instalação. Sugiro que o nome do diretório de instalação seja somente "Pyhon" para simplificar o caminho para o interpretador nos scripts. A próxima solicitação é para o backup dos arquivos substituídos durante a instalação. Por questões de segurança, vamos manter uma cópia desses arquivos que ficarão localizadas em C:\Python\BACKUP\. A etapa de seleção dos componentes será mantida com as opções padrão.

Início da instalação do Python
Figura 1. Início da instalação do Python.

Backup de arquivos alterados na instalação do Python
Figura 2. Backup de arquivos alterados na instalação do Python.

Seleção dos componentes da instalação
Figura 3. Seleção dos componentes da instalação.

O módulo Mysqldb fornece uma API para comunicação com o banco de dados Mysql, além de permitir a execução de comandos SQL e o controle de transações por commit e rollback. Não há necessidade de alteração de parâmetros na instalação do aplicativo.

Compatibilidade de versão do Python com o Mysqldb

É importante que a instalação do módulo Mysqldb ocorra após o Python já que o instalador fará uma verificação no registro do Windows sobre sua compatibilidade. Caso não haja compatibilidade a processo de instalação será finalizado.

Pesquisa sobre a compatibilidade de versão com o Python
Figura 4. Pesquisa sobre a compatibilidade de versão com o Python.

A próxima etapa é a de instalação do servidor web Apache. A instalação do Apache é muito simples bastando clicar "next" em todas as fases de instalação. Na etapa "Pasta de Destino" sugerimos que "c:\" seja o caminho, para que a instalação se localize na raiz (c:\Apache2). Após a conclusão da instalação, faremos uma pequena alteração no arquivo de configuração do Apache chamado "httpd.conf" que se fica localizado em "c:\Apache2\conf".

Para permitir que o Apache execute scripts CGI é necessário incluir na diretiva Options o valor "ExecCGI" e em AddHander, que será responsável pelo mapeamento das extensão do arquivo, o valor ".pl".

Abaixo as alterações no arquivo "httpd.conf":


Options Indexes FollowSymLinks ExecCGI

AddHandler cgi-script .cgi .py

Mudança do caminho de instalação do apache para (c:\)
Figura 5. Mudança do caminho de instalação do apache para "c:\".

Agora o apache está pronto para rodar scripts Python. Agora criaremos o diretório "webmobile" que será nossa aplicação de exemplo e ficará localizada em "c:\Apache2\htdocs\webmobile". Em seguida criaremos um script que imprimirá o famoso "Alô Mundo Python" na tela. Segue o código do script "index.py".

Local de instalação da aplicação de exemplo com o script index.py
Figura 6. Local de instalação da aplicação de exemplo com o script index.py.

Listagem 1. Script "index.py" que imprimirá o texto "Alô mundo Python".


1. #!/Python/python

2. print 'Content-type: text/html'

3. print

4. print "<HTML><BODY>"

5. print "<H1>Olá Mundo Python!</H1>"

6. print "</BODY></HTML>"

Na linha 1 é informado o caminho para o interpretador Python. Essa forma de caminho, que não é a padrão do Windows, utilizando contra-barras, pode ser aplicada desde que o Apache esteja instalado na mesma unidade de disco do Python. A linha 2 informa o tipo de conteúdo que irá para o navegador que no caso é text/html, mas que poderia ser image/gif, video/mpeg ou text/css.

A linha 3 é uma linha em branco que representa a conclusão do cabeçalho e o início do que será exibido no navegador.

As linhas 4, 5 e 6 representam o conteúdo do HTML gerado na web. Cada linha de código poderá sempre ser iniciada e terminada por aspas ou blocos delimitados com 3 aspas (simples ou duplas).

Script index.py em execução na web
Figura 7. Script index.py em execução na web.

Agora que tudo está funcionando, podemos iniciar a construção da aplicação. Ela será composta por um cadastro de produtos de supermercado e por uma tabela que exibirá os dados inclusos no banco.

Utilizaremos o banco de dados Mysql, porém não abordaremos detalhes de sua configuração por não ser o foco desse artigo.

Listagem 1. Script sm.sql que criará o banco de dados do cadastro de produto.


CREATE DATABASE /*!32312 IF NOT EXISTS*/ sm;

USE sm;

CREATE TABLE produto (

  COD int(3) NOT NULL auto_increment,

  DESCRICAO varchar(100) NOT NULL default '',

  CATEGORIA varchar(50) NOT NULL default '',

  FORNECEDOR varchar(100) NOT NULL default '',

  UNIDADE varchar(50) NOT NULL default '',

  DATA date NOT NULL default '0000-00-00',

  OBS varchar(250) NOT NULL default '',

  PRIMARY KEY  (COD)

) TYPE=MyISAM;

Após a definição do banco de dados, criaremos os scripts Python que farão o acesso ao banco de dados e exibirão o resultado em html. Os scripts estarão em subdiretórios que representarão as camadas do MVC (Model, View and the Controller). Este paradigma tem como objetivo quebrar a aplicação, separando lógica de apresentação, facilitando a manutenção do código.

O script “cadastro.py” que é responsável pela exibição do formulário de cadastro, receberá a entrada dos dados do produto e o script “cadastrado.py” que receberá os dados via POST, acionará a camada de negócio, e essa, enviará os parâmetros necessários à camada de dados para que ocorra persistência.


Listagem 2.

Script cadastrar.py que receberá os dados do produto e enviará para o script cadastrado.py.


#!/Python/python

 

import sys, cgi, cgitb

sys.path.append('/Apache2/htdocs/webmobile')

from urllib import urlencode

from Negocio.Produto import Produto

 

cgitb.enable()

p = Produto()

ret = p.selecionar()

v = cgi.FormContentDict()

print 'Content-Type: text/html'

print

print"""

<html>

<head>

<title>Cadastro de produto</title>

</head>

Listagem 3. Parte do script cadastrado.py que informará para a camada de negócio que existe uma solicitação de cadastro. Se tudo correr bem, a página será redirecionada para o script cadastrar.py e a mensagem “Produto Cadastrado” será exibida na tela. Caso contrário, a mensagem “Erro ao cadastrar” será apresentada.



try:

 

   u = Produto()  

   u.cadastrar(descricao,categoria,fornecedor,unidade,agora,obs)

   print 'Location: cadastrar.py?'+urlencode({'msg':'Produto cadastrado!'})

   print

except:

   print 'Location: cadastrar.py?'+urlencode({'msg':'Erro ao cadastrar'})

   print

 

Listagem 4. A classe Produto da camada de negócio invocará o método cadastrar da Classe ProdutoBD que está na camada de dados.



from Dados.ProdutoBD import ProdutoBD

class Produto:

 

    def cadastrar(self,descricao,categoria,fornecedor,unidade,agora,obs):

      oObjetoBD = ProdutoBD()

      return oObjetoBD.cadastrar(descricao,categoria,fornecedor,unidade,agora,obs)

   

    def selecionar(self):

      oObjetoBD = ProdutoBD()

      return oObjetoBD.selecionar()

 

Listagem 5. na camada de Dados teremos a Classe ProdutoDB. Nessa classe estará à consulta SQL utilizada na aplicação que será repassada para a classe BD.



from BD import BD

 

class ProdutoBD:

 

   def __init__(self):

      self.oConexao = BD()

 

   def cadastrar(self,descricao,categoria,fornecedor,unidade,agora,obs):

      sql = "INSERT INTO produto SET descricao = '"+descricao+"', categoria = '"+categoria+"', fornecedor='"+fornecedor+"',unidade = '"+unidade+"', data = '"+agora+"', obs = '"+obs+"'"

      self.oConexao.conn.execute(sql)        

      self.oConexao.bd.commit()

      return ""

 

   def selecionar(self):

      sql = "SELECT * FROM produto ORDER BY descricao ASC"

      self.oConexao.conn.execute(sql)

      r = self.oConexao.conn.fetchall()

      self.oConexao.Close()

      return r

 

Listagem 6. A classe BD utilizará o módulo Mysqldb que conterá a API de comunicação com o Mysql. É preciso informar o usuário e senha que foi configurado no Mysql nesse momento.



 

import sys, MySQLdb

 

class BD:

   def __init__(self):

      self.bd = MySQLdb.connect(host="localhost", user="root", passwd="", db="sm")

      self.conn = self.bd.cursor()

 

   def Close(self):

      self.conn.close()

 

A estrutura de diretórios da aplicação será:



 Webmobile

  Apresentacao

    Cadastrar.py

    Cadastrado.py

  Dados

    BD.py

    ProdutoBD.py

  Negocio

    Produto.py

    

Com isso podemos executar a aplicação. Qualquer erro de script será relatado no arquivo "c:\Apache2\logs\error.log" ou executando o interpretador Python passando como parâmetro o nome do script.

Tela principal da aplicação com o cadastro de produto
Figura 8. Tela principal da aplicação com o cadastro de produto.

Tela apresentada após a inclusão do produto. A tabela apresenta todos os produtos cadastrados
Figura 9. Tela apresentada após a inclusão do produto. A tabela apresenta todos os produtos cadastrados.

Conclusões

A programação Web em Python traz grandes benefícios para os desenvolvedores, porque é uma linguagem de livre distribuição e porque vem ganhando muitos adeptos desde sua criação por sua clareza e robustez. Empresas como Nokia, Google e Nasa acreditaram no seu potencial e incorporaram Python em seus produtos.

Marcelo Lobo é especialista em Desenvolvimento de Aplicações para Internet, atualmente trabalha no Serpro, atuando no desenvolvimento de portais WEB em Python para publicação de dados de desempenho de rede dos órgãos clientes. Experiência também em Java, J2me e .NET.