Веб-программирование → Регистрация пользователей в Django

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

Цикл статей про Django:

1. Создаем веб-приложение на Django 3.0.6
2. Основы Django фреймворка
3. Статические файлы (js, css, картинки) в Django
4. Расширение html-файлов в Django
5. Регистрация в Django
6. Модели и Базы данных в Django

 

1. База данных

Чтобы хранить данные о пользователях нужна база данных. Django при первом запуске автоматически создает Sqlite базу данных. В папке вашего проекта должен быть файл db.sqlite3. Если нет, то ничего страшного. Это и есть файл базы данных. 

В этой базе данных должна быть таблица для пользователей. Джанго сам создает эту таблицу. Для этого нужно выполнить следующую команду: Перед выполнением этой команды, обязательно активируйте virtualenv.

python manage.py migrate

Вы увидите как Джанго создает таблицы и его поля.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
 ...

Все, теперь у вас база данных готова для хранения данных о пользователях. 

2. Создание первого пользователя

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

python manage.py createsuperuser

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

После успешного создания пользователя, попробуем войти в Админку от имени этого пользователя. Для этого, запустите сайт, откройте страницу http://localhost:8000/admin/ и введите данные пользователя. Вы должны попасть в админку, и увидеть Группы и Пользователей. 

 

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

2. Страница логина

Теперь сделаем простую страницу входа. Для этого откроем файл urls.py и добавим в самом начале списка urlpatterns такую строку: 

path('accounts/login/', LoginView.as_view(), name="login"),

По этому url (account/login/) мы будем показывать страницу логина. Мы дали название этому url, чтобы по названию его использовать потом. Еще мы указали что этот запрос будет обрабатывать класс LoginView. Откройте файл views.py и создайте там класс LoginView:

class LoginView(TemplateView):
    template_name = "registration/login.html"

    def dispatch(self, request, *args, **kwargs):
        context = {}
        if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect("/")
            else:
                context['error'] = "Логин или пароль неправильные"
        return render(request, self.template_name, context)

Эта вьюшка, при открытии будет показывать файл  registration/login.html, в котором будет форма входа на сайт. Когда пользователь заполнит форму и отправит POST запрос, то мы сначала проверим правильно ли ввел пользователь свои данные с помощью функции authenticate. Затем, мы вызовем функцию login, чтобы пользователь вошел в систему. Как вы видите, после успешного входа, мы перенаправляем пользователя на главную страницу с помощи функции redirect.  

Не забудьте вначале файле импортировать функции для логина и другие функции:

from django.contrib.auth import authenticate, login
from django.shortcuts import redirect, render

И еще не забудьте класс LoginView импортировать в urls.py.

from mysite.views import HomeView, ContactsView, LoginView

Мы отображаем шаблон из файла registration/login.html. Поэтому нам нужно создать папку registration внутри папки templates. А внутри папки registration создать HTML файл login.html

Содержимое файла login.html должна быть приерно такой: 

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Вход на сайт</h1>
    {% if error %}
        <div style="color:red;">{{ error }}</div>
    {% endif %}
    <form method="post">
        {% csrf_token %}
        <input type="text" name="username" placeholder="Логин">
        <input type="password" name="password" placeholder="Пароль">
        <input type="submit" value="Войти">
    </form>

</body>
</html>

Данную страницу можно оформить как хотите, главное чтобы все что внутри тега <form> должна быть точно такой.

Здесь мы создали форму для входа. И в этой форме если есть переменная error, мы показываем ее красным цветом. В этой переменной будет сообщение об ошибке. 

 

Ссылка на страницу логина

Ссылка на страницу входа должна быть на главной странице. Откройте шаблон вашей главной страницы home.html:

И где нибудь добавьте ссылку:

<a href="{% url 'login' %}">Войти</a>

Теперь запускаем сайт, открываем главную страницу и видим кнопку Войти. Нажав на нее, переходим на страницу, где вы должны увидеть форму входа.

Попробуйте ввести неправильный логин и пароль и войти. Вы увидите ошибку. Затем введите имя пользователя и пароль вашего суперпользователя и нажмите внопку Войти. Если вы все правильно ввели, то перейдете снова на главную страницу.

В старых версиях Джанго покажет ошибку Page not found со ссылкой на страницу http://localhost:8000/accounts/profile/. Он говорит что страница профиля не найдена. Джанго автоматически перекидывает пользователя на страницу профиля после логина. Поэтому сейчас мы создадим эту страницу.

3. Страница профиля

В этой странице обычно показывается информация о текущем пользователе. Мы будем просто показывать его имя пользователя и email. 

Url на страницу профиля должна быть /accounts/profile/. Добавим его в файл urls.py после строки login, чтобы получилось так:

urlpatterns = [
    path('accounts/login/', LoginView.as_view(), name="login"),
    path('accounts/profile/', ProfilePage.as_view(), name="profile"),

Остальное в файле urls.py не стирайте. 

Страницу профиля будет обрабатывать класс ProfilePage, который мы щас создадим в файле views.py. Откроем его, и добавим в самом конце:

class ProfilePage(TemplateView):
    template_name = "registration/profile.html"

Этот view класс будет нам показывать html страницу profile.html. Создайте новый файл profile.html в папке registration. И заполните его так:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Профиль</title>
</head>
<body>
    <h1>Мой профиль</h1>

    Имя пользователя: {{ user.username }} <br>
    Email: {{ user.email }}
</body>
</html>

Теперь, нам нужно подключить класс ProfilePage в файл urls.py. Откройте файл urls.py и напишите рядом с остальными импортами:

from mysite.views import ProfilePage

 или импортируйте с помощью Alt+Enter в PyCharm. 

После этого, перезапустите сайт, снова откройте браузер и перейдите на страницу профиля http://127.0.0.1:8000/accounts/profile/. Вы должны увидеть ваши данные. Если так, то все ок.

Выше, в шаблоне profile.html мы использовали переменную user чтобы показать данные пользователя. Эта переменная есть во всех шаблонах, которые рендерятся через View классы. 

 

4. Регистрация нового пользователя через сайт

Покажу самый простой пример регистрации. Для этого нужно чтобы пользователь ввел свои данные. Мы зарегистрируем ему новый аккаунт. 

Для начала добавим url для страницы регистрации:

url(r'^accounts/register/$', RegisterView.as_view(), name="register"),

Теперь откроем файл views.py. И где нибудь добавим класс RegisterView, который будет обрабатывать страницу регистрации. 

class RegisterView(TemplateView):
    template_name = "registration/register.html"

После этого откроем urls.py снова и сымпортируем RegisterView туда

from mysite.views import ProfilePage, RegisterView

Как видно RegisterView открывает файл register.html. Создадим его в папке registration. И заполним так:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Регистрация</h1>
    <form method="post">
        {% csrf_token %}
        Имя пользователя: <input type="text" name="username"><br>
        Email: <input type="email" name="email"><br>
        Пароль: <input type="password" name="password"><br>
        Пароль еще раз: <input type="password" name="password2"><br>

        <input type="submit" value="Регистрация">
    </form>
</body>
</html>

Мы будем просить пользователя ввести новое имя пользователя, email и пароль два раза. После того как пользователь нажмет кнопку "Регистрация", браузер отправит POST запрос на сервер, потому что мы указали method="post". А  csrf_token это ключ защиты. Он нужен, но пока не обязательно знать зачем. 

Так, дальше нам нужно обработать введенные данные. Запрос придет на тот же RegisterView. Откроем его, и добавим метод dispatch:

class RegisterView(TemplateView):
    template_name = "registration/register.html"

    def dispatch(self, request, *args, **kwargs):
        if request.method == 'POST':
            username = request.POST.get('username')
            email = request.POST.get('email')
            password = request.POST.get('password')
            password2 = request.POST.get('password2')

            if password == password2:
                User.objects.create_user(username, email, password)
                return redirect(reverse("login"))

        return render(request, self.template_name)

Надо сделать импорт методов redirectreverse и модель User :

from django.shortcuts import redirect, render
from django.urls import reverse
from django.contrib.auth.models import User

В метод dispatch будут приходить все запросы направленные на страницу регистрации. Если вы помните, то в протоколе  HTTP есть два основных метода(запроса) : это POST и GET. GET запрос отправляется когда вы вводите какой-то адрес в браузер или нажимаете на ссылку. И GET запрос не должен ничего изменять на сервере. а POST запрос отправляется когда на сервер нужно отправить какие-то данные и что-то на сервере изменить или создать. В нашем случае нам нужно создать пользователя, поэтому мы используем POST запрос. 

В методе dispatch если пришел POST запрос, то мы получим из запроса данные пользователя и если все правильно, то создадим нового пользователя и отправим на страницу login. Если пришел не POST запрос или пароли не совпадают, то снова отобразим страницу регистрации. 

Все готово к регистрации. Добавим ссылку на страницу регистрацию на главной:

<a href="{% url 'register' %}">Регистрация</a>

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

Давайте сделаем так, чтобы после логина, мы попадали на страницу профиля. Откройте класс LoginView. И вместо строчки:

return redirect("/")

напишите:

return redirect(reverse("profile"))

Функция reverse по имены пути указанной в urls.py возвращает URL. 

Вот так просто это все делается!

4862 0
Alisher Alikulov