2017-01-11 38 views
3

ユーザー登録後にトークンを取得しようとしていますが、できません。 私はこれを読んでpostとこれはdocですが、私はそれを得ていません。私もこのような何かをしようとしたUserRegistrationSerializer、しかしそれはまだ働いていない。そして私はこれを見つけましたissueしかし、私は私が何をしなければならないか分からないと思います。ここでDjoser、django-rest-framework-jwt、django-rest-frameworkの登録後にトークンを取得

は私のmodels.pyです:

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

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

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') 

私のアプリのURL:

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

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 

私はすべてこれに新たなんだと私は本当に私が間違ってやっているのか分かりません。 私は誰かが助けてくれることを願っています。

+1

最初の見解の後にいくつかの発見があります:1)セキュリティ上の理由(例えば、パスワードをプレーンテキストで保存するなど)のためにDjangoの組み込みユーザーモデルを使用することをお勧めします。 2)セキュリティの理由から、ユーザーシリアライザとユーザーviewsetにパスワードフィールドを追加しないでください。 3) 'ModelSerializer'の' create() 'メソッドは、あなたが使用しようとしている' validated_data'を受け入れるため、ビュー内のコメント付きコードはシリアライザに属しているはずです。 4)ユーザモデルに定義されていないシリアライザに 'url'フィールドがあります。 5)DRFをよく理解してください。 –

+0

1-4)あなたは正しいです。私はすでにそれを変更しました。私はまだ登録後にトークンを取得していないので、今すぐポットします。しかし、今ははるかに良いようです。 5)私がそれをやろうとしている唯一の方法は、プログラミングをして何ができないのかを尋ねることですね。 :) –

+0

私はそれがdjoserの_create_機能を使用していることを知っていますが、私はそれを使用したいと思います。 –

答えて

3

答えが見つかりました。

要点は、djoserのRegistrationViewをオーバーライドする必要があるということです。私はそれが私の見解を取るべきであると言うお奨めのURLで

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() 

、その後:

だから、私はこの見解を書きました。以上です。

関連する問題