[英]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.