Создание log-in view

Начнем с использования механизма Django authentication framework, чтобы пользователи могли войти на наш веб-сайт. Наше представление должно выполнять следующие действия для входа в систему:

  1. Получение username и пароля, из формы.
  2. Аутентификация пользователя по данным, хранящимся в базе данных.
  3. Проверка, активности пользователя.
  4. Вход в систему на сайте и запуск сессии.

Во-первых, мы собираемся создать форму входа. Создайте файл forms.py в каталоге приложения account и добавьте в него следующие строки:

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

Эта форма будет использована для аутентификации пользователей через базу данных. Обратите внимание, что графический элемент PasswordInput используется для отрисовки HTML-элемента input, включая атрибут type="password". Измените файл views.py приложения account и добавьте в него следующий код:

from django.http import HttpResponse
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from .forms import LoginForm

def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(username=cd['username'], password=cd['password'])
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated successfully')
                else:
                    return HttpResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
    else:
        form = LoginForm()
    return render(request, 'account/login.html', {'form': form})

Вот что делает ,базовый log-in view: когда представление user_login вызывается с запросом GET, мы создаем новую log-in форму с form = LoginForm(), чтобы отобразить его в шаблоне. Когда пользователь отправляет форму с помощью POST, мы выполняем следующие действия:

  1. Создается экземпляр формы с отправленными данными с помощью form = LoginForm(request.POST) .
  2. Проверяется валидность формы. Если форма невалидна, то в шаблоне отображаются ошибки формы (например, если пользователь не заполнил одно из полей).
  3. Если отправленные данные являются валидными, мы ищем пользователя в базе данных с помощью метода authenticate(). Этот метод принимает username и password и возвращает объект User. Если пользователь не прошел аутентификацию, возвращается необработанный HttpResponse, отображающийся на экране.
  4. Если пользователь успешно прошел аутентификацию, мы проверяем, активен ли он с помощью атрибуту is_active. Если пользователь не активен, возвращается HttpResponse, отображающийся на экране.
  5. Если пользователь активен, он входит на сайт. Мы установлмваем сессию, вызвав метод login() и возвращаем сообщение об успешном выполнении.

Обратите внимание на разницу между authenticate и login: authenticate() проверяет учетные данные пользователя и возвращает user объект в случае успеха; login() задает пользователя в текущей сессии.

Теперь необходимо создать шаблон URL-адреса для этого представления. Создайте новый файл urls.py в каталоге приложения account и добавьте в него следующий код:

from django.conf.urls import url
from . import views

urlpatterns = [
    # post views
    url(r'^login/$', views.user_login, name='login'),
]

Измените основной файл urls.py, расположенный в каталоге проекта bookmarks, и включите шаблоны URL-адресов приложения account:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^account/', include('account.urls')),
]

Теперь доступ к log in view можно получить по URL-адресу. Настало время создать шаблон для этого представления. Поскольку для этого проекта нет шаблонов, можно начать с создания базового шаблона, который может быть расширен с помощью шаблона log in. Создайте следующие файлы и каталоги в каталоге приложения account:

templates/
    account/
        login.html
    base.html

Отредактируйте шаблон base.html:

{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link href="{% static "css/base.css" %}" rel="stylesheet">
</head>
<body>
<div id="header">
    <span class="logo">Bookmarks</span>
</div>
<div id="content">
    {% block content %}
    {% endblock %}
</div>
</body>
</html>

Это будет базовый шаблон для сайта. Как и в предыдущем проекте, мы включаем стили CSS в главный шаблон. Эти статические файлы можно найти в архиве, который предоставляется вместе с книгой. Скопируйте каталог static/ приложения account в то же место в проекте, чтобы можно было использовать статические файлы.

Базовый шаблон определяет title и блок content, которые могут быть заполнены контентом с помощью расширяющих шаблонов.

Создадим шаблон для нашей формы входа. Откройте шаблон account/login.html и добавьте в него следующий код:

{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}
    <h1>Log-in</h1>
    <p>Please, use the following form to log-in:</p>
    <form action="." method="post">
        {{ form.as_p }}
        {% csrf_token %}
        <p><input type="submit" value="Log-in"></p>
    </form>
{% endblock %}

Этот шаблон включает форму, созданную в представлении. Поскольку наша форма будет отправлена через POST, мы включаем тег шаблона {% csrf_token %} для защиты CSRF.

В базе данных еще нет пользователей. Сначала необходимо создать суперпользователя, чтобы получить доступ сайту администрирования для управления другими пользователями. Откройте терминал и выполните:

python manage.py createsuperuser

Заполните требуемое имя пользователя, электронную почту и пароль. Затем запустите сервер разработки с помощью команды:

python manage.py runserver

И откройте в браузере http://127.0.0.1:8000/admin/ . Вы увидите сайт администрирования Джанго, в том числе модели пользователя и группы системы аутентификации Джанго. Он будет выглядеть следующим образом:

Создайте нового пользователя и перейдите на страницу http://127.0.0.1:8000/account/login/ . Вы увидите форму входа на сайт:

Теперь отправьте форму, оставив одно из полей пустым. В этом случае будет показано, что форма невалидна:

Если ввести несуществующий логин или неверный пароль, будет получено сообщение Invalid login.

Если ввести существующие учетные данные, будет получено сообщение Authenticated successfully:

results matching ""

    No results matching ""