Советы по пользовательской модели пользователя и пользовательским сериализаторам аутентификацииPython

Программы на Python
Ответить
Anonymous
 Советы по пользовательской модели пользователя и пользовательским сериализаторам аутентификации

Сообщение Anonymous »

Мне нужен совет разработчиков, имеющих опыт работы с Django. Я относительно новичок в этой платформе и работаю над приложением для управления аптеками с серверной частью на базе Django. Я планирую использовать номер мобильного телефона для регистрации в приложении. Большинство встроенных классов предоставляют электронную почту в качестве способа регистрации и создания новых пользователей по умолчанию. Я использую DRF для REST API, dj-rest-auth и django-allauth для обработки аутентификации. Сейчас я работаю только с учетными записями пользователей в приложении. Не могли бы вы дать чек и указать на ошибки. Будем признательны за любые советы по поводу передового опыта.
Вот пользовательская модель пользователя

Код: Выделить всё

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from .managers import CustomUserManager
from django.core.validators import RegexValidator

phone_validator = RegexValidator(regex=r"^[1-9]\d{9}$", message="Invalid Number")

class UserRole(models.TextChoices):
RETAILER = "RETAILER", "retailer"
STAFF = "STAFF", "staff"

class CustomUser(AbstractUser):
username = None
mobile = models.CharField(max_length=10, validators=[phone_validator], unique=True)
role = models.CharField(
max_length=20, choices=UserRole.choices, default=UserRole.STAFF
)
tenant = models.ForeignKey(
"tenants.Tenant",
on_delete=models.CASCADE,
null=True,
blank=True,
related_name="users",
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = CustomUserManager()

USERNAME_FIELD = "mobile"

REQUIRED_FIELDS = []

def __str__(self):
return f"{self.mobile} ({self.get_full_name()})"
Вот пользовательские сериализаторы.

Код: Выделить всё

from dj_rest_auth.serializers import LoginSerializer
from dj_rest_auth.registration.serializers import RegisterSerializer
from rest_framework import serializers
from allauth.account.adapter import get_adapter

class MobileLoginSerializer(LoginSerializer):
username = None

mobile = serializers.CharField(required=True)

def validate(self, attrs):
attrs["username"] = attrs.get("mobile")
return super().validate(attrs)

class MobileRegisterSerializer(RegisterSerializer):
username = None
first_name = serializers.CharField()
last_name = serializers.CharField()
mobile = serializers.CharField()
pharmacy_name = serializers.CharField(write_only=True)
role = serializers.ChoiceField(choices=["RETAILER", "STAFF"])

def get_cleaned_data(self):
data = super().get_cleaned_data()
data.update(
{
"first_name": self.validated_data.get("first_name", ""),
"last_name": self.validated_data.get("last_name", ""),
"mobile": self.validated_data.get("mobile", ""),
"pharmacy_name": self.validated_data.get("pharmacy_name", ""),
"role": self.validated_data.get("role", ""),
}
)
return data

def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()

user = adapter.save_user(request, user, self, commit=False)
user.first_name = self.cleaned_data.get("first_name")
user.last_name = self.cleaned_data.get("last_name")
user.mobile = self.cleaned_data.get("mobile")
# user.pharmacy_name = self.cleaned_data.get("pharmacy_name")
user.role = self.cleaned_data.get("role")
user.save()

self.custom_signup(request, user)
return user
Вот соответствующие фрагменты кода из settings.py

Код: Выделить всё

...
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["dj_rest_auth.jwt_auth.JWTCookieAuthentication"]
}

REST_AUTH = {
"USE_JWT": True,
"JWT_AUTH_COOKIE": "access",
"JWT_AUTH_REFRESH_COOKIE": "refresh",
"JWT_AUTH_HTTPONLY": True,
"LOGIN_SERIALIZER": "accounts.serializers.MobileLoginSerializer",
"REGISTER_SERIALIZER":  "accounts.serializers.MobileRegisterSerializer",
}

AUTH_USER_MODEL = "accounts.CustomUser"

ACCOUNT_USER_MODEL_USERNAME_FIELD = "mobile"
ACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = "username"

...

SITE_ID = 1
P.S.: ответам ИИ я не доверяю. Разные агенты предлагают разные подходы, и теперь я в замешательстве.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»