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())
Nenhum comentário:
Postar um comentário