Pergunta

Eu tenho uma situação que requer redirecionando os usuários que já estão conectados fora da página de login para outra página. Eu vi menção de que isso pode ser feito com decoradores que faz sentido, mas eu sou bastante novo para usá-los. No entanto, estou usando o login do Django e uma terceira visão do partido (de django-registro). Eu não quero mudar nada do código em django.contrib.auth ou django-registro. Como posso aplicar um decorador para uma visão que não deve ser modificada a fim de obter o comportamento desejado.

Agradecemos antecipadamente!

UPDATE: eu descobri que eu erroneamente associada à função de login com o módulo de registro. django-registro não tem nada a ver com esta questão. No entanto, eu ainda preciso ser capaz de substituir o comportamento padrão login (). Quaisquer pensamentos?

Foi útil?

Solução

Três outras maneiras de fazê-lo, mas você vai precisar usar seu próprio urlconf para estes:

  1. Adicione o decorador à vista diretamente na urlconf:

    ...
    (regexp, decorator(view)),
    ...
    

    Você precisa importar a vista e o decorador para o urlconf porém, é por isso que eu não como este. Eu prefiro ter o menor número de importações em meus urls.py do possível.

  2. Import a visão em um <app>/views.py e adicione o decorador lá:

    import view
    
    view = decorator(view)
    

    Muito parecido com o método de Vinay embora mais explícita desde que você precisa de um urlconf para ele.

  3. Enrole a vista em um novo ponto de vista:

    import view
    
    @decorator
    def wrapperview(request, *args, **kwargs):
        ... other stuff ...
        return view(request, *args, **kwargs)
    

    O último é muito útil quando você precisa mudar views genéricas. Isto é o que muitas vezes acabam fazendo de qualquer maneira.

Sempre que você usar um urlconf, a fim de padrões importa, por isso poderá ter para baralhar em torno de qual padrão é chamado pela primeira vez.

Outras dicas

Se você tiver a função decorador e você sabe qual modo de exibição no Django-registo você quer decorar, você poderia apenas fazer

registration.view_func = decorator_func(registration.view_func)

onde registration é o módulo em django-registro que contém a função de visualização que você quer decorar, view_func é a função de vista que você quer decorar, e decorator_func é o decorador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top