Recapitulando Link para o cabeçalho
No post anterior dei uma introdução sobre o que é o web2py e iniciamos a construção de uma aplicação, porém não através de um scaffolding (uma aplicação base).
Escrevemos um “hello world” personalizado onde o nome passado por argumento era retornado no corpo do retorno da nossa aplicação.
O próximo passo Link para o cabeçalho
Ainda sem uma aplicação bem definida decidi abordar um pouco da criação de um modelo e sua aplicação.
Este será então o nosso segundo hello world, criaremos um modelo, faremos sua exposição através da view e seu controle através de um controlador. Será dado uma pincelada como ter visões alternativas sobre o mesmo controlador.
Definindo o modelo Link para o cabeçalho
Crie um arquivo dentro do diretório models chamado db.py
com o seguinte conteúdo:
db = DAL('sqlite://storage.sqlite')
db.define_table(
'marcas',
Field('nome')
)
db.define_table(
'carros',
Field('modelo', notnull=True),
Field('ano', notnull=True),
Field('marca', 'reference marcas'),
)
Agora temos definidos dois modelos de nossa aplicação, lembrando que estes modelos serão aplicados à visão e a persistência de dados.
O que acabamos de definir é que utilizaremos o sqlite como banco de dados, e neste banco de dados temos duas tabelas onde serão armazenados nossos dados.
Em uma delas temos uma lista de marcas, e em outra uma lista de carros associados a estas marcas. Todo carro deve possuir obrigatoriamente modelo, ano e marca.
Populando nossas tabelas Link para o cabeçalho
Ainda no arquivo db.py
adicione as seguintes linhas:
# verifica se a tabela de marcas está vazia
if db(db.marcas).count() == 0:
db.marcas.insert(nome='Fiat')
db.marcas.insert(nome='Ford')
db.marcas.insert(nome='Chevrolet')
db.commit()
# verifica se a tabela de carros está vazia
if db(db.carros).count() == 0:
db.carros.insert(modelo='Idea', marca=1, ano='2003')
db.carros.insert(modelo='Ka', marca=2, ano='2004')
db.carros.insert(modelo='Celta', marca=3, ano='2005')
db.commit()
Temos 3 carros de 3 marcas distintas. Preste atenção no if
que foi adicionado antes da inserção do carro, ele previne que a cada requisição carros repetidos sejam adicionados à tabela.
Lembre-se também que essa maneira de povoar os dados é somente para desenvolvimento e teste e pode ser apagado após os registros serem adicionados ao banco de dados. Apagar estas linhas evita duas consultas desnecessárias ao banco de dados.
Controlando o que será exibido Link para o cabeçalho
Vamos voltar ao nosso controlador, o arquivo default.py
(hello/controllers/default.py)
Já vimos que o controlador recebe uma requisição, realiza processamento e retorna alguma resposta ao solicitante. Vamos então apagar o conteúdo de index e reescrevê-lo agora consultando os carros existentes em meu banco de dados.
O código será o seguinte:
def index():
# pode ser traduzido como select * from carros
# ou seja, todos os carros na tabela
carros = db(db.carros).select()
# dicionário que define as variáveis presentes no ambiente
# durante renderização da template html
return {'carros': carros}
Com essa alteração nossa visão também deve ser alterada. Para uma visualização interessante vamos fazer uma tabela.
Edite o arquivo index.html
(hello/views/default/index.html)
<!doctype html>
<html lang="pt-br">
<head>
<meta charset="UTF-8" />
<title>Carros</title>
</head>
<body>
<table class="table">
<tr>
<th>Modelo</th>
<th>Marca</th>
<th>Ano</th>
</tr>
{{for carro in carros:}}
<tr>
<td>{{=carro.modelo}}</td>
<td>{{=carro.marca.nome}}</td>
<td>{{=carro.ano}}</td>
</tr>
{{pass}}
</table>
</body>
</html>
Um único detalhe que chamo atenção neste código é {{=carro.marca.nome}}
, como as tabelas possuem relação o web2py irá ficar responsável por buscar o nome do modelo de cada carro.
Visualize através da URL: http://localhost:8000/hello/default/index.json
Exibindo os mesmos dados de forma diferente Link para o cabeçalho
Já que temos uma resposta HTML, o quão será difícil retornar um JSON com estes mesmos dados para uma possível comunicação entre sistemas ou até mesmo para consumo de um aplicativo móvel?
Na verdade é extremamente simples. Apenas crie no mesmo diretório onde se encontra a view index.html
um arquivo index.json
com o seguinte conteúdo.
{{from gluon.serializers import json}}{{=XML(json(response._vars))}}
Para consultar visite a url: http://localhost:8000/hello/default/index.json
Então é isso pessoal!
Até a próxima!
{}’s