Урок 4: Аутентификация пользователей – Ведь не все должны иметь доступ к вашему блогу!


Урок 4

Урок 4: Аутентификация пользователей – Ведь не все должны иметь доступ к вашему блогу!

Привет снова, маги кода! 🧙‍♂️ К этому моменту вы уже создали блог, добавили комментарии и, возможно, получили такие отзывы, как “Отличный шрифт” или “Почему Comic Sans?”. Но сегодня мы поднимем ставки, ведь не каждый заслуживает доступа к вашему секретному блогу.

Сегодня мы добавим магию логина и логаута. А чтобы всё выглядело красиво, создадим общий шаблон base.html, который придаст вашему блогу структурированность. И, конечно, добавим перенаправление после выхода, ведь никто не хочет застрять на странице “выхода”, правда?


Шаг 1: Активируем виртуальное окружение (А.К.А. Надеваем мантию мага)

Прежде чем начать магию, убедитесь, что ваше виртуальное окружение активировано. Это как убедиться, что вы надели мантию перед тем, как начать колдовать огненными шарами. Никто не хочет неприятностей, верно?

Проверьте, активировано ли окружение, с помощью этой команды:

echo $VIRTUAL_ENV

Если вы видите путь в ответе, значит всё в порядке! Если нет, активируйте окружение:

source venv/bin/activate

Когда вы увидите (venv) в начале строки терминала, это значит, что вы в своём уютном магическом мире, где все зависимости находятся в безопасности под защитой заклинания. 🛡️


Шаг 2: Встроенная аутентификация (Django – ваш волшебный дворецкий)

Представьте себе: Django уже всё сделал за вас! У него есть встроенная система аутентификации. Это значит, что вам не нужно писать логику логина с нуля (у кого на это есть время?). Django как дворецкий, который выполняет всю грязную работу, оставляя вам больше времени для важных дел – например, для выбора идеального перекуса во время программирования.

Давайте настроим это!

Откройте файл myblog/myblog/urls.py (да, дважды “myblog”) и добавьте эти строки, чтобы подключить логику для логина и логаута:

from django.contrib.auth import views as auth_views
from django.urls import path, include  # Добавляем include для маршрутов приложения

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),  # Подключаем маршруты блога
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

Теперь Django будет отвечать за вход и выход. Это как невидимый дворецкий для вашего кода!


Шаг 3: Перенаправление после логина и логаута (Ведь никто не хочет бродить в никуда)

По умолчанию Django перенаправляет пользователей на /accounts/profile/ после входа, но давайте признаем: никто не хочет оказаться на случайной и скучной странице. Давайте настроим перенаправление на главную страницу блога и после выхода тоже!

Добавляем перенаправление после логина:

Откройте файл settings.py (он находится в myblog/myblog/settings.py) и добавьте эту магическую строку:

# Перенаправление на главную страницу блога после логина
LOGIN_REDIRECT_URL = '/blog/'

Добавляем перенаправление после логаута:

Чтобы обеспечить плавный выход, добавьте следующую строку также в settings.py:

# Перенаправление на главную страницу блога после логаута
LOGOUT_REDIRECT_URL = '/blog/'

Теперь каждый, кто войдёт или выйдет из системы, будет телепортирован прямо на главную страницу блога, где происходит вся магия! 🎨


Шаг 4: Создаем шаблон base.html (Общий фундамент для всех страниц)

Теперь давайте добавим красоты вашему блогу, потому что даже маги хотят стильно выглядеть! Создадим шаблон base.html, который будет основой для всех страниц блога. Это как ваш замок, в каждой комнате которого (странице) можно добавлять уникальные детали. 🏰

Создайте файл base.html в папке blog/templates:

myblog/
    blog/
        templates/
            base.html

Теперь добавьте следующий код в base.html:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}Мой Блог{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Мой Блог</h1>
        <nav>
            <ul>
                <li><a href="{% url 'blog_index' %}">Главная</a></li>
                <li>
                    {% if user.is_authenticated %}
                        <a href="{% url 'logout' %}">Выйти</a>
                    {% else %}
                        <a href="{% url 'login' %}">Войти</a>
                    {% endif %}
                </li>
            </ul>
        </nav>
    </header>

    <div class="content">
        {% block content %}
        <!-- Здесь будет контент каждой страницы -->
        {% endblock %}
    </div>

    <footer>
        <p>&copy; 2024 Мой Блог. Все права защищены. И да, мы используем куки.</p>
    </footer>
</body>
</html>

Вот и наш замок! 🎉 Теперь у нас есть заголовок, навигация и футер, готовые встретить ваших посетителей. Магия начинается в {% block content %} – там каждая страница добавит свою уникальность. 🌟


Шаг 5: Создаем шаблон login.html (Открываем волшебные ворота)

Давайте создадим страницу логина, чтобы пользователи могли войти в ваш блог. Django ожидает, что шаблон login.html будет находиться в папке registration.

  1. Создайте папку registration в blog/templates:

    • В папке вашего приложения blog, создайте папку templates, если её ещё нет, а затем создайте внутри неё папку registration.

    Структура должна выглядеть так:

    myblog/
        blog/
            templates/
                registration/
                    login.html
    
  2. Добавьте этот код в login.html, чтобы использовать шаблон base.html:

{% extends "base.html" %}

{% block title %}Войти{% endblock %}

{% block content %}
<h2>Вход в аккаунт</h2>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Войти</button>
</form>
{% endblock %}

Теперь у вас есть страница входа, которая наследует стиль от base.html, так что всё будет выглядеть последовательно. Теперь можно впускать пользователей – но только избранных! 😉


Шаг 6: Обновляем blog_index.html и blog_post_detail.html

Теперь, когда у нас есть шаблон base.html, давайте обновим файлы blog_index.html и blog_post_detail.html, чтобы они также использовали этот шаблон.

6.1 Обновляем blog_index.html

Откройте myblog/blog/templates/blog_index.html и замените код на:

{% extends "base.html" %}

{% block title %}Главная Блога{% endblock %}

{% block content %}
<h2>Добро пожаловать в мой блог!</h2>
<ul>
    {% for post in posts %}
        <li>
            <strong><a href="{% url 'blog_post_detail' post.pk %}">{{ post.title }}</a></strong> - {{ post.created_at }}
            <p>{{ post.content|truncatewords:30 }}</p>
            <a href="{% url 'blog_post_detail' post.pk %}">Читать дальше</a>
        </li>
    {% endfor %}
</ul>
{% endblock %}

Теперь наш блог-индекс выглядит стильно и аккуратно благодаря шаблону base.html.

6.2 Обновляем blog_post_detail.html

Откройте файл myblog/blog/templates/blog_post_detail.html и обновите его:

{% extends "base.html" %}

{% block title %}{{ post.title }}{% endblock %}

{% block content %}
<h2>{{ post.title }}</h2>
<p>{{ post.created_at }}</p>
<p>{{ post.content }}</p>

<h3>Комментарии</h3>
<ul>
    {% for comment in comments %}
        <li><strong>{{ comment.author }}</strong>: {{ comment.content }}</li>
    {% empty %}
        <li>Комментариев пока нет. Будьте первым, кто оставит комментарий!</li>
    {% endfor %}
</ul>

<h3>Оставить комментарий</h3>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Отправить</button>
</form>
{% endblock %}

Теперь и страницы с постами используют наш новый шаблон.


Шаг 7: Добавляем ссылку для выхода (Каждый выход заслуживает стильного ухода)

Что за логин, если нельзя выйти? В шаблоне base.html мы уже добавили ссылку для выхода в навигации. Она будет динамически изменяться в зависимости от того, вошёл пользователь или нет:

{% if user.is_authenticated %}
    <a href="{% url 'logout' %}">Выйти</a>
{% else %}
    <a href="{% url 'login' %}">Войти</a>
{% endif %}

Это как волшебные двери – когда вы выходите, они аккуратно закрываются за вами (наверное, чтобы вы могли пойти и выпить кофе).


Шаг 8: Тестируем магию (Вот где начинается веселье!)

Время протестировать функции входа и выхода!

Запускаем сервер:

python3 manage.py runserver

Переходите на http://127.0.0.1:8000/login/ и попробуйте войти. После входа вы будете перенаправлены на http://localhost:8000/blog/ (или куда вы указали в LOGIN_REDIRECT_URL).

Проверьте также выход – вы будете перенаправлены на главную страницу блога после логаута.


Шаг 9: Создайте суперпользователя (Каждый замок должен иметь своего короля)

Перед тем, как завершить урок, не забудьте создать учётную запись суперпользователя. Это даст вам полный контроль над блогом!

Запустите эту команду:

python3 manage.py createsuperuser

Заполните все поля и вуаля – теперь вы суперпользователь, и у вас полный доступ к административному интерфейсу.


Шаг 10: Деактивируем виртуальное окружение (Ведь даже магам нужно отдыхать)

Когда вы закончите на сегодня (или решите, что пора перекусить), не забудьте деактивировать виртуальное окружение:

deactivate

Теперь вы можете спокойно наслаждаться своим перекусом, зная, что ваш блог на Django работает, как часы.


Заключение Урока 4

И вот, вы добавили аутентификацию пользователей (логин и логаут), настроили красивый шаблон base.html и перенаправление после входа и выхода. Теперь ваши пользователи могут входить, оставлять комментарии и чувствовать себя как дома на страницах вашего блога!

В следующем уроке мы займёмся регистрацией пользователей, чтобы вы могли привлекать подписчиков (которые обязательно будут комментировать ваши гениальные посты). А пока что – отдыхайте и наслаждайтесь своей магией кода, возможно, за чашечкой чая и пирожным. 🍰


Смотрите также