Menu
CoddyTech

Cerrar sesión

Parte de la sección Usuarios y cuentas del Journey de Django de Coddy. Lección 3 de 16.

Un usuario que ha iniciado sesión no tiene forma de cerrarla. El mismo include() añadió /accounts/logout/, llamado logout: termina la sesión, así que la cookie deja de apuntar a un usuario.

Un enlace normal no sirve. Un enlace envía una solicitud GET, y una solicitud GET nunca debería cambiar nada: una página podría ocultar una imagen cuya dirección sea tu URL de cierre de sesión y cerrar tu sesión. Por eso, LogoutView solo acepta solicitudes POST, y una solicitud GET recibe 405 Method not allowed.

Un botón que cambia algo es un pequeño formulario POST, incluso sin campos. Su action indica la URL a la que envía la solicitud, así que puede estar en cualquier página:

<form method="post" action="{% url 'cart:empty' %}">
    {% csrf_token %}
    <button type="submit">Empty cart</button>
</form>

Después de cerrar sesión, Django redirige a LOGOUT_REDIRECT_URL. No tiene ningún valor predeterminado: sin él, ves la página de cierre de sesión del administrador. Asígnale "/" en settings.py.

challenge icon

Desafío

Fácil

Añade un botón Log out.

  1. En base.html, debajo de Signed in as, añade un formulario que envíe una solicitud a {% url 'logout' %} con {% csrf_token %} y un botón Log out.
  2. En settings.py, establece LOGOUT_REDIRECT_URL en "/".

Inicia sesión como ada (contraseña coddy-pass-123) y pulsa «Cerrar sesión»: el encabezado dice You are not signed in.

Pruébalo tú mismo

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>{% block title %}Notes{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'notes/style.css' %}">
</head>
<body>
    <header>
        <a class="brand" href="{% url 'notes:list' %}">Notes</a>
        <nav>
            <a href="{% url 'notes:create' %}">New note</a>
        </nav>
        <div class="account">
            {% if user.is_authenticated %}
            <p>Signed in as {{ user.username }}</p>
            {% else %}
            <p>You are not signed in.</p>
            <a href="{% url 'login' %}">Log in</a>
            {% endif %}
        </div>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
</body>
</html>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Usuarios y cuentas

Practica por tu cuenta: Playground de Django