2017-01-11 10 views
3

Ich versuche, den Token nach der Benutzerregistrierung zu bekommen, aber ich kann nicht. Ich lese dieses post und dieses doc, aber ich verstehe es nicht. Ich habe auch versucht, so etwas zu tun UserRegistrationSerializer, aber es funktioniert immer noch nicht. Und ich habe diese issue gefunden, aber ich denke, ich verstehe nicht, was ich zu tun habe.Get Token nach der Registrierung mit Djoser, Django-Rest-Framework-JWT und Django-Rest-Framework

Hier ist meine 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 

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

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

meine App-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)), 
] 

und meine 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 

Ich bin neu mit all das und ich weiß wirklich nicht, was ich falsch mache. Ich hoffe, dass jemand helfen kann.

+1

Ein paar Erkenntnisse nach dem ersten Blick: 1) Es wird empfohlen, aus Sicherheitsgründen Djangos eingebautes Benutzermodell anstelle Ihres eigenen zu verwenden (z. B. speichern Sie Ihr Passwort jetzt im Klartext). 2) Sie sollten dem Benutzer-Serializer und dem Benutzer-Viewset für den Lesezugriff aus Sicherheitsgründen kein Passwortfeld hinzufügen. 3) Der kommentierte Code in Sicht sollte wahrscheinlich zum Serialisierer gehören, weil 'create()' Methode auf 'ModelSerializer' valided_data akzeptiert, die Sie zu verwenden versuchen. 4) Es gibt ein 'url'-Feld im Serializer, das in Ihrem Benutzermodell nicht definiert ist. 5) Machen Sie sich mit DRF näher vertraut. –

+0

1-4) Sie hatten Recht. Ich habe es schon geändert. Ich werde es jetzt kippen, weil ich immer noch ohne Token nach der Registrierung komme. Aber es scheint jetzt viel besser. 5) Ich muss es nur programmieren und fragen, wenn ich nichts mehr machen kann, oder? :) –

+0

Ich weiß, dass es die Funktion _create_ von djoser verwendet, aber ich möchte, dass es meine verwendet. –

Antwort

3

Ich fand die Antwort.

Der Punkt ist, dass ich die Registrierungsansicht von djoser überschreiben muss.

Also schrieb ich diese Ansicht:

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

und dann in den Urls Ich muss sagen, dass es meiner Meinung nach nehmen sollte. Und das ist es.

Verwandte Themen