Dans mon application django, l'utilisateur peut accéder aux pages de connexion / d'inscription via l'URL même après s'être connecté. Comment les empêcher d'accéder à ces pages?
urls.py
from django.contrib.auth.models import User class EmailAuthBackend(object): """ Authenticate using an e-mail address. """ def authenticate(self, request, username=None, password=None): try: user = User.objects.get(email=username) if user.check_password(password): return user return None except User.DoesNotExist: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
Bien que je puisse écrire une instruction if-else pour vérifier les utilisateurs authentifiés dans views.py , mais je n'ai utilisé aucune fonction pour la connexion dans views.py. J'utilise le système de connexion par défaut de django et une page authentication.py pour une connexion personnalisée (authentification à l'aide d'une adresse e-mail).
authentication.py
from django.urls import path from django.contrib.auth import views as auth_views from . import views app_name = 'account' urlpatterns = [ path('signup/', views.register, name='register'), path('', auth_views.LoginView.as_view(), name='login'), ]
Veuillez me suggérer un moyen efficace de rediriger les utilisateurs déjà authentifiés vers la page d'accueil chaque fois qu'ils essaient d'accéder à des pages de connexion ou d'inscription en tapant son URL sur le navigateur.
3 Réponses :
Vous pouvez rediriger les utilisateurs en modifiant votre fichier urls.py comme ci-dessous:
from django.urls import path from django.contrib.auth import views as auth_views from . import views app_name = 'account' urlpatterns = [ path('signup/', views.register, name='register'), path('', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'), ]
Cela redirigera les utilisateurs déjà authentifiés depuis la page de connexion. Pour vous inscrire, vous devrez personnaliser votre fonction d'enregistrement, ajouter une vérification si l'utilisateur est authentifié.
Merci Monsieur. Ceci est exactement ce que je cherchais!
@Wasi Comment puis-je spécifier un chemin pour y rediriger?
Vous pouvez utiliser le dictionnaire extra_context
pour transmettre l'URL de redirection comme valeur de next
. Consultez la documentation de django pour plus d'informations.
Vous pouvez également utiliser ce décorateur.
@login_excluded('app:redirect_to_view') def someview(request): # ...
Appelez-le ensuite dans votre views.py.
def login_excluded(redirect_to): """ This decorator kicks authenticated users out of a view """ def _method_wrapper(view_method): def _arguments_wrapper(request, *args, **kwargs): if request.user.is_authenticated: return redirect(redirect_to) return view_method(request, *args, **kwargs) return _arguments_wrapper return _method_wrapper
En ajoutant aux réponses de Wasi et Flaab, si vous avez des fonctions, vous pouvez vérifier rapidement vos fonctions comme ceci:
def register(request): if request.user.is_authenticated: messages.success(request, "You are already logged in") return redirect("YOUR-DESIRED-PATH-NAME") # YOUR CODE BLOCK #