8 de novembro de 2010

request.now ou datetime.now?

O Web2py tem a variável request.now que você pode usar no lugar de datetime.datetime.now() sem precisar importar nada. Essa variável guarda o horário que a requisição foi executada.

Eu estou fazendo uma aplicação com uma parte rodando via cron e me deparei com uma situação inusitada: todos os registros alterados no processo da cron tinham o mesmo horário de modificação. Isso porque eu usei o update=request.now na definição do campo que guarda a hora da última modificação do registro.

A situação é que, no shell (cron), a requisição ocorre apenas uma vez, no momento que ele é iniciado. Já na web, a requisição ocorre toda vez que uma URL é solicitada pelo browser. Como no shell a característica é executar processos em background, não existe a URL sendo solicitada. Na web, a cada clique de link ou de botão, uma nova requisição é realizada.

Então, o request.now, na verdade, contém o horário que a requisição iniciou.

Para resolver meu problema, eu passei a usar o update=datetime.datetime.now(). Conferindo os resultados depois dessa modificação, me deparei com o mesmo problema: todos os registros alterados pelo processo da cron com o mesmo horário de modificação.

Recorri à lista mundial do web2py e aprendi que esses valores para default e update são avaliados apenas no momento que os models são executados, quando associados a conteúdos fixos ou variáveis.

Para resolver o problema, temos que usar lambda assim: update=lambda:datetime.datetime.now(). Dessa forma, como temos a chamada de uma função (lambda no nosso caso), toda vez que um registro for modificado, esse conteúdo do update será reavaliado.

O mesmo vale para a propriedade default.

Portanto, use os parâmetros default e update com lambda, para que atualizem o conteúdo no momento de inserção/alteração do registro.

Segue um exemplo:

from datetime import datetime
db.define_table('ficha',
    Field('nome', 'string'),
    Field('quando', 'datetime', default=lambda:datetime.now())

29 de outubro de 2010

print vai pra console

Volta e meia precisamos depurar programas, principalmente quando o negócio do aplicativo é complexo ou quando estamos aprendendo uma tecnologia nova, pra ver como ela funciona.

No Web2py você pode depurar sua aplicação web sem interferir no resultado das suas páginas.

Se você usar o comando print do Python, o conteúdo printado sai na console do Web2py, ao invés de ser mostrado no browser.

Faça um teste e veja como funciona. Com isso você consegue entender melhor a sequência de eventos do Web2py e depurar sua aplicação.

Fica a dica.

22 de outubro de 2010

Markmin pronto pra usar

Se você já precisou permitir que os usuários do seu aplicativo inserissem conteúdo para ser mostrado, provavelmente pensou na alternativa de usar alguma linguagem de marcação que não fosse HTML.

A Wikipedia popularizou isso, e hoje temos várias por aí. Quase todas têm certa semelhança, mas o importante é que seu usuário não precisa estudar HTML para usar seu aplicativo.

O problema em alguns ambientes é fazer seu aplicativo entender isso e converter a linguagem de marcação em HTML para o browser mostrar.

O Web2py traz o Markmin, uma linguagem de marcação bem simples, que resolve a maioria dos seus problemas. E o melhor: é facinho de usar.

Bem, não vou ficar escrevendo muito. Veja: o Markmin no Web2py.