Menu
CoddyTech

Đăng xuất

Thuộc phần Người dùng và tài khoản trong hành trình Django của Coddy. Bài học 3 trên 16.

Người dùng đã đăng nhập không có cách nào để đăng xuất. Cùng một lệnh include() đã thêm /accounts/logout/, có tên logout: lệnh này kết thúc phiên, nên cookie không còn trỏ đến người dùng nữa.

Chỉ dùng liên kết thì không được. Liên kết gửi yêu cầu GET, mà yêu cầu GET không bao giờ được làm thay đổi bất cứ điều gì: một trang có thể ẩn một hình ảnh có địa chỉ là URL đăng xuất của bạn rồi khiến bạn đăng xuất. Vì vậy, LogoutView chỉ chấp nhận POST, còn yêu cầu GET sẽ nhận 405 Method not allowed.

Nút thực hiện thay đổi là một biểu mẫu POST nhỏ, kể cả khi không có trường nào. action chỉ URL mà biểu mẫu gửi yêu cầu đến, nên biểu mẫu có thể nằm trên bất kỳ trang nào:

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

Sau khi đăng xuất, Django chuyển hướng đến LOGOUT_REDIRECT_URL. Không có giá trị mặc định: nếu không thiết lập, bạn sẽ thấy trang Logged out của trang quản trị. Hãy đặt giá trị này thành "/" trong settings.py.

challenge icon

Thử thách

Dễ

Thêm nút Log out.

  1. Trong base.html, bên dưới Signed in as, thêm một biểu mẫu gửi yêu cầu đến {% url 'logout' %} cùng với {% csrf_token %} và nút Log out.
  2. Trong settings.py, đặt LOGOUT_REDIRECT_URL thành "/".

Đăng nhập bằng tài khoản ada (mật khẩu coddy-pass-123) rồi nhấn Log out: phần đầu trang sẽ hiển thị You are not signed in.

Tự làm thử

{% 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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Người dùng và tài khoản

Tự luyện tập: Playground Django