django получит токен и идентификатор пользователя после успешной регистрации - PullRequest
0 голосов
/ 30 июня 2018

Я создаю сервер с пользовательскими страницами регистрации, используя rest и django (последние версии).

У меня есть 3 обязательных поля (уникальное имя пользователя, уникальный номер телефона, пароль) и 1 необязательное. Схема это: Пользователь отправляет номер телефона на сервер, мы проверяем, существует ли пользователь, а если нет - запрашивают регистрацию. В обоих случаях я хочу отправить токен и user_id в качестве ответа, если учетные данные верны.

Темы 2016 года не работают в моем случае, я думаю, из-за последних обновлений Framework и Python.

Вот что у меня сейчас в view.py:

class RegisterView(APIView):
  renderer_classes = [renderers.JSONRenderer]

  def post(self, request):
    phone = request.POST.get('phone')
    username = request.POST.get('username')
    password = request.POST.get('password')
    name = request.POST.get('name', '')
    try:
        ChatUser.objects.create_user(username, phone, password, name)
        return Response({'success': True, 'token': """THERE SHOULD BE TOKEN"""})
    except Exception:
        return Response({'success': False})

class CheckPhone(APIView): # works fine 
    renderer_classes = [renderers.JSONRenderer]

    def post(self, request):
        phone_number = request.POST.get('phone_number')
        try:
            User.objects.get(phone=phone_number)
            return Response("""asks for login""")
        except User.DoesNotExist:
            return Response("""asks for registration""")

models.py:

class ChatUserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, username, phone, password, name, **extra_fields):
        """Create and save a User with the given phone and password."""
        if not phone:
            raise ValueError('The given phone must be set')
        if not username:
            raise ValueError('The given username must be set')
        username = self.model.normalize_username(username)
        user = self.model(phone=phone, username=username, name=name, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return username

    def create_user(self, username, phone, password, name, **extra_fields):
        """Create and save a regular User with the given phone and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(username, phone, password, name, **extra_fields)

class ChatUser(AbstractUser):
    REQUIRED_FIELDS = ['phone', 'name']

    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        help_text=_(
            'The groups this user belongs to. A user will get all permissions '
            'granted to each of their groups.'
        ),
        related_name="chatuser_set",
        related_query_name="user",
    )
    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('user permissions'),
        blank=True,
        help_text=_('Specific permissions for this user.'),
        related_name="chatuser_set",
        related_query_name="user",
    )
    username = models.CharField(_('username'), max_length=25, unique=True)
    phone_regex = RegexValidator(regex=r'^\+?7?\d{9,15}$', message="Phone number must be entered in the format: '+71234567890'. Up to 15 digits allowed.")
    phone = models.CharField(_('phone_number'), validators=[phone_regex], max_length=17, unique=True) # validators should be a list
    name = models.CharField(_('name'), max_length=30, blank=True)
    USERNAME_FIELD = 'username'
    objects = ChatUserManager()

Итак, как я могу получить токен и user_id в этих случаях, а также я что-то пропустил при создании пользовательских моделей?

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете создать токен используя from rest_framework.authtoken.models import Token

from rest_framework.authtoken.models import Token

class RegisterView(APIView):
  renderer_classes = [renderers.JSONRenderer]

  def post(self, request):
    phone = request.POST.get('phone')
    username = request.POST.get('username')
    password = request.POST.get('password')
    name = request.POST.get('name', '')
    try:
        chat_user = ChatUser.objects.create_user(username, phone, password, name)
        token = Token.objects.create(user=chat_user)
        return Response({'success': True, 'token': token.key})
    except Exception:
        return Response({'success': False})

Редактировать

def _create_user(self, username, phone, password, name, **extra_fields):
        """Create and save a User with the given phone and password."""
        if not phone:
            raise ValueError('The given phone must be set')
        if not username:
            raise ValueError('The given username must be set')
        username = self.model.normalize_username(username)
        user = self.model(phone=phone, username=username, name=name, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

Вы должны вернуть user , а не username

Надеюсь, это поможет.

...