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.
Saiba mais: Curso de Python
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.
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.
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
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".
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).
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.
#!/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.
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.