Sostituire le viste di Django con decoratori
-
22-07-2019 - |
Domanda
Ho una situazione che richiede il reindirizzamento degli utenti che hanno già effettuato l'accesso dalla pagina di accesso a un'altra pagina. Ho visto menzionare che questo può essere realizzato con decoratori che hanno senso, ma sono abbastanza nuovo nell'usarli. Tuttavia, sto usando il login django e una vista di terze parti (dalla registrazione django). Non voglio modificare nessuno dei codici in django.contrib.auth o django-registration. Come posso applicare un decoratore a una vista che non deve essere modificata per ottenere il comportamento desiderato.
Grazie in anticipo!
AGGIORNAMENTO: ho scoperto di aver erroneamente associato la funzione di accesso al modulo di registrazione. django-registration non ha nulla a che fare con questo problema. Tuttavia, devo ancora essere in grado di sovrascrivere il comportamento predefinito di login (). Qualche pensiero?
Soluzione
Altri tre modi per farlo, anche se dovrai usare il tuo urlconf per questi:
-
Aggiungi il decoratore alla vista direttamente in urlconf:
... (regexp, decorator(view)), ...
Devi importare la vista e il decoratore in urlconf, motivo per cui non mi piace questo. Preferisco avere il minor numero possibile di importazioni nel mio urls.py.
-
Importa la vista in un
<app>/views.py
e aggiungi lì il decoratore:import view view = decorator(view)
Praticamente simile al metodo di Vinay, anche se più esplicito in quanto è necessario un urlconf per esso.
-
Avvolgi la vista in una nuova vista:
import view @decorator def wrapperview(request, *args, **kwargs): ... other stuff ... return view(request, *args, **kwargs)
L'ultimo è molto utile quando è necessario modificare le visualizzazioni generiche. Questo è ciò che finisco spesso per fare comunque.
Ogni volta che usi un urlconf, l'ordine dei pattern è importante, quindi potresti aver bisogno di spostarti su quale pattern viene chiamato per primo.
Altri suggerimenti
Se hai la funzione decoratore e sai quale vista nella registrazione django vuoi decorare, puoi semplicemente farlo
registration.view_func = decorator_func(registration.view_func)
dove registration
è il modulo nella registrazione django che contiene la funzione di visualizzazione che si desidera decorare, view_func
è la funzione di visualizzazione che si desidera decorare e decorator_func
è il decoratore .