segunda-feira, 2 de julho de 2012

Como criar um decorator


Decorators são muito úteis quando se precisa de certas condições antes da execução de determinadas views, como por exemplo, views que obrigam o usuário estar logado para ter acesso, tais como Meus Pedidos, Meu Painel,  etc.
Para isso utiliza-se o decorator login_required, disponível no pacote django.contrib.auth.decorators. Basta adicioná-lo antes da view desejada da seguinte forma:

@login_required
def sua_view(request):
     #seu código aqui
Também é possível criar decorators personalizados, para verificar certas situações, como preenchimento completo de algum cadastro, se o cliente está com a assinatura de conteúdo em dia, etc. Para criar um decorator, basta fazê-lo da como mostra o exemplo abaixo, em qualquer arquivo ".py". Recomendo criar um arquivo separado para isso.

Exemplo:

Crie um arquivo admin.py na raiz do seu projeto com o seguinte conteúdo:
def nome_decorator(f):
     def verifica(request, *args, **kwargs):
          if <CONDICAO DE FALHA A SER TESTADA>
               # INTERROMPE O FLUXO NORMAL E NÃO EXECUTA A VIEW ASSOCIADA
          else:
               # CONDICAO DE SUCESSO, RETORNA AO FLUXO NORMAL
               return f(request, *args, **kwargs)
     verifica.__doc__= f.__doc__
     verifica.__name__= f.__name__
     return verifica

Em seu arquivo views.py, onde existe a view a ser associada ao decorator utilize:

from admin import nome_decorator

@nome_decorator
def sua_view(request):
     #seu código aqui
Fique atento para o caminho da importação do decorator, dependendo de onde salvar, pode ser que haja alteração a ser feita na linha de import.


Pode ser que precise de 2 decorators para uma mesma view como no exemplo abaixo:



@login_required
@nome_decorator
def sua_view(request):
     #seu código aqui


Para estes casos, as validações se darão na ordem que forem colocados os decorators, de cima pra baixo, ou seja, para o exemplo acima, primeiro será avaliado se o visitante está logado para depois verificar as condições colocadas no decorator personalizado que foi criado.


hasta!