Olá Gilson,
Uma das principais vantagens do web2py é a facilidade de uso, ou como diz o slogan da Jquery. 'Write Less, Do More'
Não posso falar muito a respeito de Django pois na verdade não o uso, nem nunca usei para grandes projetos a não ser para testes e estudos.
Uso muito o Pylons (que agora é Pyramid), e o Flask tbm para alguns projetos pequenos. e não posso compara-los com web2py, pois são muito diferente, neste caso o Flask é um micro, o Pylons Glued/middleware based, e o web2py é um FullStacked.
Quanto a boas práticas/facilitadores do web2py que posso citar:
Eu mecho também com Rails e fiquei um pouco assustado com o exemplo de loja de carros, que implementa os dados da tabela e junto as validações (sendo que a implementação da tabela e as validações no Rails, são separados). Isso é tranquilo?
O web2py trabalha em um esquema de model bem diferente dos outros frameworks, começando pelo fato de não usar classes para mapear o modelo relacional.
É preciso ficar claro que a DAL não é um ORM, portanto não podemos comparar com as implementações dos ORM's no Django, Rails ou outro framework.
A DAL é simplesmente uma camada de abstração do banco de dados que implementa uma série de helpers e métodos, dentro destes helpers estão os validadores.
Existem 3 tipos de validadores os de banco de dados que atuam diretamente na definição do DB (notunull, ONDELETE, default), os validadores da DAL que atuam na camada de abstração (required), e também os validadores de formulário que atuam apenas nos formulários gerados com FORM e SQLFORM por exemplo (IS_NOT_EMPTY).
Em algumas aplicações é comum definirmos todos juntos, na minha opinião isso facilita as vezes dependendo do tamanho da aplicação, principalmente se for uma app pequena.
Porém você pode fazer diferente, o que é útil também é o fato de você poder sobrepor os validador a qualquer momento, veja um exemplo:
<model>
db.define_table('pessoa',Field('nome',required=True,default='Seu nome aqui'))
</model>
A definição acima gera o SQL para a criação da tabela e no nível do banco de dados inclui DEFAULT='Seu nome aqui', inclui um validador da DAL 'required' que será validado sempre que a DAL interagoir com esta tabela, em uma função ou shell por exemplo.
<controller>
def pessoa():
#aqui podemos alterar/incluir validadores de formulário antes de gerar o form.
#criamos uma lista de validadores que podem ser criados condicionalmente
validapessoa = []
validapessoa.append(IS_NOT_EMPTY())
#atribuimos estes validadores
db.pessoa.nome.requires = validapessoa
#criamos um form
form = SQLFORM(db.pessoa)
#validamos o form
if form.accepts(request.vars, session):
#Faça algo aqui se for aceito
elif form.errors:
#faça algo se der erro
else:
#faça algo por padrão
#enviamos o form para a view no response
return dict(form=form)
</controller>
Na view:
<view>
{{=form}}
</view>
Este é apenas um exemplo de como isso pode ser feito, e de como os atributos dos objetos da DAL podem ser alterados a qualquer momento.
Existem muitas outras formas para trabalhar com essas coisas, em um de meus projetos eu utilizo @decorators para implementar validações.
As vezes as pessoas se assustam ao comparar o web2py com Django ou com Rails, mas o fato é que não podemos comparar 100% pois o web2py é muito diferente.
Na minha opinião e experiência com projetos pequenos, médios e grandes o jeito web2py tem sido mais produtivo.
Abraço
Bruno.
--
Bruno Rocha
http://about.me/rochacbruno/bio