首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注册Djoser、django-rest-framework-jwt和django-rest-framework后获取令牌

注册Djoser、django-rest-framework-jwt和django-rest-framework后获取令牌
EN

Stack Overflow用户
提问于 2017-01-11 19:08:27
回答 2查看 2.8K关注 0票数 4

我试图在用户注册后获得令牌,但我做不到。我读了这个帖子和这个文档,但我没有得到它。我也试着做一些类似UserRegistrationSerializer的事情,但是它仍然不起作用。我找到了这个问题,但我想我不明白我要做什么。

这是我的models.py:

代码语言:javascript
复制
from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.base_user import AbstractBaseUser
from django.utils.translation import ugettext_lazy as _

from .managers import UserManager


class User(AbstractBaseUser, PermissionsMixin):
    created = models.DateTimeField(_('created'), auto_now_add=True)
    email = models.EmailField(_('email'), unique=True, blank=False)
    name = models.CharField(_('name'), max_length=30, blank=False)
    last_name = models.CharField(_('last name'), max_length=100, blank=False)
    is_active = models.BooleanField(_('active'), default=True)
    birthday = models.CharField(_('birthday'), max_length=15, blank=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name', 'last_name', 'birthday']

    class Meta:
        ordering = ('created',)
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """
        Returns the short name for the user.
        """
        return self.name

我的managers.py

代码语言:javascript
复制
from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

我的serializers.py

代码语言:javascript
复制
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings

from users.models import User


class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('url', 'id', 'email', 'name', 'last_name', 'birthday')

    def create(self, request, *args, **kwargs):
        # if settings.get('SEND_ACTIVATION_EMAIL'):
        #     with transaction.atomic():
        #         user = User.objects.create_user(**validated_data)
        #         user.is_active = False
        #         user.save(update_fields=['is_active'])
        # else:
        user = User.objects.create_user()
        token = create_token(user)
        return {user, token}


def create_token(user):
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)

    return token.decode('unicode_scape')

我的应用网址:

代码语言:javascript
复制
from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter

from .views import UserViewSet

router = DefaultRouter()
router.register(r'users', UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

还有我的views.py

代码语言:javascript
复制
from rest_framework import viewsets
from rest_framework_jwt.settings import api_settings

from users.models import User
from users.serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

我是新来的,我不知道自己做错了什么。我希望有人能帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 21:34:08

我找到了答案。

关键是我必须重写djoser的RegistrationView。

所以,我写了这样的观点:

代码语言:javascript
复制
class RegistrationView(viewsets.ModelViewSet):
    queryset = User.objects.all()  # I don't know what to write here :D
    serializer_class = UserRegistrationSerializer

    permission_classes = (
        permissions.AllowAny,
    )

    def perform_create(self, serializer):
        user = serializer.save()
        signals.user_registered.send(sender=self.__class__, user=user, request=self.request)
        if settings.get('SEND_ACTIVATION_EMAIL'):
            self.send_activation_email(user)
        elif settings.get('SEND_CONFIRMATION_EMAIL'):
            self.send_confirmation_email(user)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        token = create_token(serializer.data)
        return Response(data=token, status=status.HTTP_201_CREATED, headers=headers)

    def send_activation_email(self, user):
        email_factory = utils.UserActivationEmailFactory.from_request(self.request, user=user)
        email = email_factory.create()
        email.send()

    def send_confirmation_email(self, user):
        email_factory = utils.UserConfirmationEmailFactory.from_request(self.request, user=user)
        email = email_factory.create()
        email.send()

然后在urls里我要说它应该是我的观点。就是这样。

票数 3
EN

Stack Overflow用户

发布于 2021-09-30 08:52:40

在我的例子中,我只是覆盖Djoser user_create序列化程序:

代码语言:javascript
复制
from rest_framework import serializers
from rest_framework_simplejwt.tokens import RefreshToken

from authapp.models import User
from djoser.serializers import UserCreateSerializer, UserSerializer


class AppUserCreateSerializer(UserCreateSerializer):

class Meta:
    model = User
    fields = ('email', 'password', 'full_name', 'date_of_birth', 'phone_number',)
    ref_name = "AppUser"

    def to_representation(self, instance):
    data = super(AppUserCreateSerializer, self).to_representation(instance)
    user_tokens = RefreshToken.for_user(instance)
    tokens = {'refresh': str(user_tokens), 'access': str(user_tokens.access_token)}
    data = {
    "success": "true",
    "data": data | tokens
}
    return data

并更改了设置中的默认user_create序列化程序。

代码语言:javascript
复制
    DJOSER = {
'LOGIN_FIELD': 'email',
'SERIALIZERS': {
    'current_user': 'authapp.serializers.AppUserSerializer',
    'user': 'authapp.serializers.AppUserSerializer',
    'user_create': 'authapp.serializers.AppUserCreateSerializer',
},
# Email-confirmation settings
'PASSWORD_RESET_CONFIRM_URL': '#/password-reset/{uid}/{token}',
'ACTIVATION_URL': '#/activate/{uid}/{token}',
'SEND_ACTIVATION_EMAIL': False,
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41598833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档