繁体   English   中英

django成功注册后获取令牌和用户ID

[英]django get token and userid after successful registration

我正在使用rest和django(最新版本)构建具有自定义注册页面的服务器。

我有3个必填字段(用户名唯一,电话号码唯一,密码)和1个可选字段。 模式为:用户将电话号码发送到服务器,我们检查用户是否存在-如果不存在-要求注册。 在两种情况下,如果凭据正确,我都希望发送令牌和user_id作为答案。

我认为,由于最新的框架和python更新,因此2016年的主题不适用于我。

那就是我现在在view.py中所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,并且在创建自定义模型时是否错过了任何内容?

您可以使用from rest_framework.authtoken.models import Token创建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 而不是 username

我希望这将有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM