Erreur 405 lors de la déconnexion dans Django
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte