В этой статье мы рассмотрим как делается регистрация пользователя Django через rest-framework, это очень просто.
Но перед тем как прочитать эту статью, посмотрите «Быстрый старт Django», если вы не знаете как создать проект на Django.
Подключение библиотек:
Первым делом нужно скачать нужные библиотеки для работы с этим, для этого видите в терминал или консоль вот эти команды.
1 2 | pip install djangorestframework pip install djoser |
В начале мы скачиваем rest-framework для Django, который добавляет в него логику RestAPI, следующие скачивание, это библиотека Djoser, которая сделана просто для обычной авторизации.
Дальше подключаем в «settings.py», в список INSTALLED_APPS
всё что мы скачали.
1 2 3 4 5 | INSTALLED_APPS = [ 'djoser', 'rest_framework', ... ] |
Настройка библиотек:
Теперь настраиваем библиотеки, в начале добавляем список REST_FRAMEWORK
.
1 2 3 4 5 6 | REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } |
Также добавляем список DJOSER
.
1 2 3 4 | DJOSER = { 'ACTIVATION_URL': '#/activate/{uid}/{token}', 'SEND_ACTIVATION_EMAIL': False, } |
Тут вы скорее всего заметили название параметр SEND_ACTIVATION_EMAIL с параметром False, это нужно что бы при регистрации не отправлялась почта для подтверждение EMAIL, но так нужно делать только если вы разрабатываете на локальном сервере.
Последние добавляем в «urls.py», новые пути для работы регистрации и авторизации, которые мы будем использовать.
1 2 3 4 5 | urlpatterns = [ ... path('api-auth', include('rest_framework.urls')), path('auth/', include('djoser.urls')), ] |
После этого у вас в целом всё должно работать, но для более глубокого примера мы ещё сделаем пользователя.
Создание пользователя и регистрации:
Перейдём к созданию пользователя, для этого создайте приложение используя эту команду.
1 | python3 manage.py startapp users |
У вас должна появится папка «users», там переходим во файл «models.py» и в нём создаём модель пользователя.
models.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | from django.db import models # Подключаем работу с моделями # Подключаем классы для создания пользователей from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin # Создаем класс менеджера пользователей class MyUserManager(BaseUserManager): # Создаём метод для создания пользователя def _create_user(self, email, username, password, **extra_fields): # Проверяем есть ли Email if not email: # Выводим сообщение в консоль raise ValueError("Вы не ввели Email") # Проверяем есть ли логин if not username: # Выводим сообщение в консоль raise ValueError("Вы не ввели Логин") # Делаем пользователя user = self.model( email=self.normalize_email(email), username=username, **extra_fields, ) # Сохраняем пароль user.set_password(password) # Сохраняем всё остальное user.save(using=self._db) # Возвращаем пользователя return user # Делаем метод для создание обычного пользователя def create_user(self, email, username, password): # Возвращаем нового созданного пользователя return self._create_user(email, username, password) # Делаем метод для создание админа сайта def create_superuser(self, email, username, password): # Возвращаем нового созданного админа return self._create_user(email, username, password, is_staff=True, is_superuser=True) |
Тут в начале добавили все зависимости и сделали класс для работы с моделью пользователя, внутри него создали три метода, первый для создания пользователя, внутри него проверяем, есть ли Email и Логин, если нет, то выводим сообщение об этом.
Дальше создаём пользователя, передаём туда в качестве параметров Email и логин, также есть **extra_fields
, это нужно если надо добавит дополнительные параметры, которые мы будем делать при создание администратора, сохраняем пароль и пользователя, возвращаем его.
Остальные два метода, это создание обычного пользователя и создание администратора, вот и всё.
Теперь когда с первым классом разобрались, делаем второй, который для пользователя.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Создаём класс User class User(AbstractBaseUser, PermissionsMixin): id = models.AutoField(primary_key=True, unique=True) # Идентификатор username = models.CharField(max_length=50, unique=True) # Логин email = models.EmailField(max_length=100, unique=True) # Email is_active = models.BooleanField(default=True) # Статус активации is_staff = models.BooleanField(default=False) # Статус админа USERNAME_FIELD = 'email' # Идентификатор для обращения REQUIRED_FIELDS = ['username'] # Список имён полей для Superuser objects = MyUserManager() # Добавляем методы класса MyUserManager # Метод для отображения в админ панели def __str__(self): return self.email |
Тут мы создали класс пользователя наследуем его от двух других классов, AbstractBaseUser
, базовый абстрактный класс пользователя и PermissionsMixin
, это класс для прав доступа.
Внутри него пишем параметры:
- id — Идентификатор;
- username — Логин или имя пользователя;
- email — Электронная почта;
- is_active — Поле статуса активации пользователя;
- is_staff — Поле статуса админа;
В этом коде самое интересное то, что для поля активации мы принимаем параметр default=True
, это значит то, что по умолчанию пользователь будет активирован.
Свойства USERNAME_FIELD
, это идентификатор для обращения, а REQUIRED_FIELDS
хранит список имён при регистрации администратор или суперюзера.
Также создаём objects
, и в него добавляем класс MyUserManager
, что бы могли использовать его методы.
Теперь нужно сделать миграции, для этого вводим эти две команды.
1 2 | python3 manage.py makemigrations python3 manage.py migrate |
На этом с моделями всё, тут больше не чего сказать.
serializers.py:
Теперь создаём файл «serializers.py», в папке «users» и пишем в нём такой код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # Подключаем класс для работы со сериалайзер from rest_framework import serializers # Подключаем модель user from .models import User Создаём класс UserRegistrSerializer class UserRegistrSerializer(serializers.ModelSerializer): # Поле для повторения пароля password2 = serializers.CharField() # Настройка полей class Meta: # Поля модели которые будем использовать model = User # Назначаем поля которые будем использовать fields = ['email', 'username', 'password', 'password2'] # Метод для сохранения нового пользователя def save(self, *args, **kwargs): # Создаём объект класса User user = User( email=self.validated_data['email'], # Назначаем Email username=self.validated_data['username'], # Назначаем Логин ) # Проверяем на валидность пароль password = self.validated_data['password'] # Проверяем на валидность повторный пароль password2 = self.validated_data['password2'] # Проверяем совпадают ли пароли if password != password2: # Если нет, то выводим ошибку raise serializers.ValidationError({password: "Пароль не совпадает"}) # Сохраняем пароль user.set_password(password) # Сохраняем пользователя user.save() # Возвращаем нового пользователя return user |
В начале как всегда подключаем нужные нам компоненты, потом создаём класс UserRegistrSerializer
, наследуем его от класса ModelSerializer
, в нём первым делом создаём поле password2
, для повторного пароля.
Потом идёт класс Meta
, в котором идёт настройка полей, которые будет принимать сервер, первое свойство, это откуда взять поля, второе список полей.
После класса создаём метод для создания нового пользователя, в нём делаем новый объект класса User
, проверяем совпадают ли пароли и сохраняем, возвращаем нового пользователя, тут файлам.
views.py:
Последние что осталось рассмотреть, это файл «views.py», вот он.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # Подключаем статус from rest_framework import status # Подключаем компонент для ответа from rest_framework.response import Response # Подключаем компонент для создания данных from rest_framework.generics import CreateAPIView # Подключаем компонент для прав доступа from rest_framework.permissions import AllowAny # Подключаем модель User from .models import User # Подключаем UserRegistrSerializer from .serializers import UserRegistrSerializer # Создаём класс RegistrUserView class RegistrUserView(CreateAPIView): # Добавляем в queryset queryset = User.objects.all() # Добавляем serializer UserRegistrSerializer serializer_class = UserRegistrSerializer # Добавляем права доступа permission_classes = [AllowAny] # Создаём метод для создания нового пользователя def post(self, request, *args, **kwargs): # Добавляем UserRegistrSerializer serializer = UserRegistrSerializer(data=request.data) # Создаём список data data = {} # Проверка данных на валидность if serializer.is_valid(): # Сохраняем нового пользователя serializer.save() # Добавляем в список значение ответа True data['response'] = True # Возвращаем что всё в порядке return Response(data, status=status.HTTP_200_OK) else: # Иначе # Присваиваем data ошибку data = serializer.errors # Возвращаем ошибку return Response(data) |
В начале как обычно подключаем все нужные нам зависимости, для чего какая нужна посмотрите к комментариях кода, потом создаём класс RegistrUserView
, он у нас будет отвечать за всё регистрацию, самым первым там идут свойства, опять же про них подробнее прочитаете в комментариях.
Потом идёт метод post
, и как можно понять из названия, он будет работать только если получает POST запросы от клиента, внутри его мы первым делом создаём объект serializer
, класса UserRegistrSerializer
, там в качестве параметра data
передаём request (запрос), который получаем от клиента.
Потом проверяем на валидность, если всё правильно, то сохраняем и выводим что ошибок нет, если не правильно, то показываем ошибки.
На этом создании регистрации закончилась, осталось только во файл «urls.py», в список urlpatterns добавить путь до него.
1 | path('registr/', RegistrUserView.as_view(), name='registr') |
Теперь точно всё, переходим на страницу регистрации и вот что должно появится.
Вот, если у вас появилось что то типа этого, то значит всё правильно.
Вывод:
В этой статье вы прочитали как сделать регистрация пользователя Django через rest-framework, но если вам нужна более обычная регистрация, то посмотрите статью «Как сделать регистрацию на Django».