Простой блог на Django - часть 11. Создание авторизации.

Итак, регистрация у нас уже есть, значит теперь пришло время заняться авторизацией. Начнём с того, что пропишем в маршрутах следующее: 

path('auth/', include('django.contrib.auth.urls')),

По сути, здесь мы используем встроенные в Django маршруты, а те в свою очередь (как и в случае с регистрацией), используют встроенные View функции. В итоге такое объявление даст нам маршрут /auth/login/ Однако же, если попытаться по нему зайти, то мы получим ошибку, связанную с отсутствием шаблона. Дело в том, что по умолчанию Джанго ищет шаблон здесь - newapp/templates/registration/login.html, но такового не находит. Давайте это исправим и создадим файл по указанному пути, со следующим содержимым: 

{% extends "index.html" %}
{% block title %}Войти{% endblock %}
{% block content %}   <div class="row justify-content-center">
<div class="col-md-8 p-5">
<div class="card">
<div class="card-header">Войти на сайт</div>
<div class="card-body">
{% if form.errors %}
<div class="alert alert-danger" role="alert">
Имя пользователя и пароль не совпадают. Введите правильные данные.
</div>
{% endif %}
{% if next %}
<div class="alert alert-info" role="alert">
Вы обратились к странице, доступ к которой возможен только для залогиненных пользователей.<br>
Пожалуйста, авторизуйтесь.
</div>
{% else %}
<div class="alert alert-info" role="alert">
Пожалуйста, авторизуйтесь.
</div>
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<input type="hidden"name="next" value="{{ next }}">
<div class="form-group row">
<label for="{{ form.username.id_for_label }}"class="col-md-4 col-form-label text-md-right">Имя пользователя</label>
<div class="col-md-6">
{{ form.username }}
</div>
</div>
<div class="form-group row">
<label for="{{ form.password.id_for_label }}"class="col-md-4 col-form-label text-md-right">Пароль</label>
<div class="col-md-6">
{{ form.password }}
</div>
</div>
<div class="col-md-6 offset-md-4">
<button type="submit"class="btn btn-primary">
Войти
</button>
<a href="{% url 'password_reset' %}"class="btn btn-link">
Забыли пароль?
</a>
</div>
</form>
</div><!-- card body -->
</div><!-- card -->
</div><!-- col -->
</div> <!-- row -->
{% endblock %}

Собственно, система авторизации уже готова, однако по умолчанию та View-функция, которую мы используем, будет редиректить нас вот сюда - accounts/profile/, но нас такой вариант не устраивает. Поэтому давайте изменим адрес маршрута - сделать это можно с помощью переменной LOGIN_REDIRECT_URL в файле settings.py:

LOGIN_REDIRECT_URL = 'posts:index'

Ну и заодно, можно прописать маршрут для разлогинивания:

LOGOUT_REDIRECT_URL = 'posts:index'

Здесь возможно у вас возникнет вопрос: откуда взялось posts с двоеточием? А это что-то вроде пространства имён, ведь псевдонимы маршрутов с одинаковыми именами могут встречаться в разных мини-приложениях. Поэтому, чтобы всё это корректно работало, необходимо это пространство задать - для этого в файле нашего приложения в файле posts/urls.py пропишем:

app_name = "posts"

Правда это повлечёт за собой то, что теперь для построения маршрута, потребуется немного подправить синтаксис в файле /newapp/newapp/templates/includes/post_in_cat.html

Если раньше было:

<a href="{% url 'post' post.id %}">

то теперь:

<a href="{% url 'posts:post' post.id %}">

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

LOGIN_URL = '/auth/login'

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

Коммит с актуальными изменениями https://github.com/maclen2007/simple_django_blog/commit/588133aad75a9c17a1cf834b4280187e0fd37b47

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.