Résolue

Erreur 405 lors de la déconnexion dans Django

# Django # HTML

Plus un commentaire à partager, qu'une qestion : Pour la version django : 5.0.7

Pour la partie "Connexion et déconnexion avec les classes", j'ai rencontré cette erreur 405 avec le /logout.

"when I try to logout using http://127.0.0.1:8000/accounts/logout/ it shows http error 405 and not deleting the sessionid"

La raison est la suivante : (sur stackoverflow) "In Django, logging out requires a POST request for security reasons, to prevent CSRF attacks. If you try to log out using a direct URL, which sends a GET request, Django will reject it and show a "405 Method Not Allowed" error.

To fix it, create a logout form that sends a POST request. This can be a simple form with just a logout button. Place this form where you want the logout functionality in your templates, like in a header or sidebar. If you want you can create a separate html file and include the template where necessary."

Pour s'adapter et faire simple par rapport à la vidéo, il faut créer une page template html dédiée (exemple: profile.html) qui nous sera redirigé vers le lien ".../accounts/profile" après s'être authentifié sur compte/login.

Sur la vue de ton projet, il faut remplacer HttpResponse par render pour pouvoir afficher la page profile.html.
(Mon fichier profile.html a été créé sous le répertoire template/registration.)

Dans la vue (view.py)

def profile(request):
    return render(request,'registration/profile.html')

Dans le fichier profile.html (template/registration/) mettre à minima dans le body

<form action="{% url 'logout' %}" method="post">
    {% csrf_token %}
    <button type="submit">Déconnexion</button>
</form>

Lors de votre connexion, vous aurez un bouton Déconnexion.
Lorsque tu cliqueras sur déconnexion, cela s'effectuera comme sur la déconnexion présenté par Thibauld.
(page de déconnexion standard Django)

Salut Fab !

Alors on avait eu le cas à l'époque avec Cam aussi :)

Regarde le code source version 5.1

class LogoutView(RedirectURLMixin, TemplateView):
    """
    Log out the user and display the 'You are logged out' message.
    """

    http_method_names = ["post", "options"]
    template_name = "registration/logged_out.html"
    extra_context = None

    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        """Logout may be done via POST."""
        auth_logout(request)
        redirect_to = self.get_success_url()
        if redirect_to != request.get_full_path():
            # Redirect to target page once the session has been cleared.
            return HttpResponseRedirect(redirect_to)
        return super().get(request, *args, **kwargs)

Et en 4.2 on voit que la get ça passe ^^

class LogoutView(RedirectURLMixin, TemplateView):
    """
    Log out the user and display the 'You are logged out' message.
    """

    # RemovedInDjango50Warning: when the deprecation ends, remove "get" and
    # "head" from http_method_names.
    http_method_names = ["get", "head", "post", "options"]
    template_name = "registration/logged_out.html"
    extra_context = None

Oui, les dernières versions django sont sur la 5.x.
Sur la video de formation, on saisit dans l'url : accounts/logout pour se déconnecter.
On arrive alors le message html 405.

mon commentaire était pour décrire comment résoudre ce problème pour ne pas rester bloquer. 😊

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.