Emm
Emm

Reputation: 2507

Django Rest API returning ValueError: Invalid format string

Getting the error

Invalid format string when creating a new user in Django. Even though I am getting this error, a new user is being created.

Here is my serializers.py:

from django.contrib.auth.models import User
from rest_framework import serializers

#changed from serializers.HyperLinked to ModelSerializer
class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        #removed url from fields
        fields = ['username', 'email', 'password']
        extra_kwargs = {
            'password': {'write_only': True},
        }
        def create(self,validated_data):
            user = User.objects.create_user(
                                            username=validated_data['username'],
                                            password=validated_data['password'],
                                            email=validated_data['email'])
            user.set_password(validated_data['password'])
            user.save()
            return user

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class UserSerializerWithToken(serializers.ModelSerializer):
    token = serializers.SerializerMethodField()
    password = serializers.CharField(write_only=True)


class PasswordSerializer(serializers.Serializer):
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

My urls.py:

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from . import views
from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView, TokenVerifyView)
from .api import RegisterApi

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

urlpatterns = [
    path('', include(router.urls)),
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    path('api/register', RegisterApi.as_view()),
]

and api.py:

from rest_framework import generics, permissions, mixins
from rest_framework.authentication import TokenAuthentication
from rest_framework.response import Response
from .serializers import RegisterSerializer, UserSerializer
from django.contrib.auth.models import User
from rest_framework.permissions import AllowAny

#Register API
class RegisterApi(generics.GenericAPIView):
    serializer_class = RegisterSerializer
    #remove this if it doesn't work
    authentication_classes = (TokenAuthentication,)
    permission_classes = (AllowAny,)
    def post(self, request, *args,  **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,
            "message": "User Created Successfully.  Now perform Login to get your token",
        })

Any ideas why I might be getting this error?

Upvotes: 0

Views: 416

Answers (1)

Alena Nidilko
Alena Nidilko

Reputation: 11

If you took the code in the same place as me, take a look: models.py -> class User(AbstractBaseUser, PermissionsMixin): -> def _generate_jwt_token(self): -> 'exp': dt.strftime('%S')

It worked for me after removing the conversion to Int and not decoding token

    def _generate_jwt_token(self):
    """
    Генерирует веб-токен JSON, в котором хранится идентификатор этого
    пользователя, срок действия токена составляет 1 день от создания
    """
    dt = datetime.now() + timedelta(days=1)

    token = jwt.encode({
        'id': self.pk,
        'exp': dt.strftime('%S')
    }, settings.SECRET_KEY, algorithm='HS256')

    return token

(formatting is broken, but you'll figure it out)

Upvotes: 1

Related Questions