10
votes

Comment empêcher l'utilisateur d'accéder à la page de connexion dans django lorsqu'il est déjà connecté?

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.


0 commentaires

3 Réponses :


14
votes

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é.


3 commentaires

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.



3
votes

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


0 commentaires

0
votes

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 #


0 commentaires