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.
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. –
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? :) –
Ich weiß, dass es die Funktion _create_ von djoser verwendet, aber ich möchte, dass es meine verwendet. –