Pesquisar este blog

quinta-feira, 25 de dezembro de 2008

web.py com jinja2!

Primeiramente, Feliz Natal meu povo! rsrsrs, meu natal não foi grande coisa, passei doente em casa, mas o de vocês pode ter sido massa, não é mesmo? Bem, de qualquer forma, os panettones vão entrar em promoção e a vida será bela novamente!

Agora, planejamentos para o final de ano. Vamo ver oq a prefeita vai aprontar.

De qualquer forma, a idéia aqui é falar da utilização do jinja2 com o web.py. Para quem não sabe, o web.py é um framework minimalista escrito em python, que foca na criação de pequenos sites que precisam ficar prontos logo, não tem grandes perspectivas de crescimento, e precisam ser rápidos.

O web.py é um framework bem completo, levando em conta o que ele se propõe a fazer. Ele te oferece uma camada de abstração sobre os templates(arquivos html), sobre o modelo(o banco de dados), e sobre a camada de negócios(a lógica do aplicativo). Tudo de forma bem simples, entretanto, para algumas pessoas, isso não é o bastante.

Bem, eu venho de um bom tempo de desenvolvimento com django, então, eu estou acustumado(e gosto) ao estilo de templates do django. Códigos python nos meus templates, nem na base de bala! Então, quando fui tentar utilizar o web.py para fazer um site aqui, a primeira coisa que notei era que o sistema de templates dele era bem feio e difícil(não tão fácil quanto poderia). Então, conhecendo o jinja2, que é um sistema de templates semelhante ao do django, resolvi logo testá-lo no meu aplicativo.

Procedimento
Usar bibliotecas que não são do web.py no web.py é bem fácil. Adicione o jinja2 dentro do seu projeto, do lado do pacote web contendo o código do framework web.py. Nisso, a partir do código principal do seu aplicativo(onde você configura a url e o quê fica onde), você adiciona o jinja2, cria um environment para ele, e usa para fazer a renderização dos templates. Vejamos como ficaria um código exemplo:

# módulo do python
import os

# importando o que precisamos do jinja2
from jinja2 import Environment
from jinja2 import FileSystemLoader
from jinja2 import TemplateNotFound, TemplateSyntaxError

# dicionário com as configurações do ambiente
env_config = {
# marque com True para que o Jinja procure por atualizações no template
"auto_reload":False,
# marque com True para que todos os templates sejam "escaped"
"autoescape":False,
# define quantas páginas ficarão no cache por vez
"cache_size":50,
# ser para adicionar tags {% nome %} aos templates.
"extensions":[],
# templates loader. Tupla que informa ao jinja2 onde procurar os templates
"loader":FileSystemLoader(TEMPLATE_DIRS),
}

# os templates serão carregados a partir do objeto env, que é uma instância de
# environment
env = Environment(**env_config)

# path é o caminho (relativo aos caminhos do TEMPLATE_DIRS) para o template
# vars é um dicionário com variáveis a serem disponibilizados no template
def render(path, vars):
try:
# templates are automatically cached
template = env.get_template(path)
except TemplateNotFound:
raise TemplateNotFound(path)
except TemplateSyntaxError:
raise TemplateSyntaxError(path)
return template.render(vars)

Bem, o código acima funciona bem, mas colocá-lo junto com o arquivo principal do ambiente não é uma boa. Sugiro que você crie um arquivo view.py e coloque o código acima dentro, e a partir das classes que processam as requisições(Handlers) você chame o método render de view.

Outra dica é colocar para que a classe Handler busque templates que possuam o seu nome. Por exemplo, um handler Casa na classe Barco devolveria o template barco/casa.html. Essa é uma prática legal que já economiza algum código.

Bem, de qualquer forma, é isso. Vou aqui brincando com o web.py até achar algo que me faça sair dele. rsrsrs, ou não. bem, ele é minimalista, então, para coisinhas, acho que vou sempre usar ele.

ps: depois posto um template para projetos web.py, com classes e pastas para facilitar a vida de quem desenvolve.

Até mais e boas festividades!

Nenhum comentário:

Postar um comentário