So I am working on a project using Django and Django rest framework. I'm trying to create an api for my website which allows users to register/log in/log out. I'm following [this tutorial] (https://iheanyi.com/journal/user-registration-authentication-with-django-django-rest-framework-react-and-redux) for the initial set up. My issue is that when I try to run my test code to create a user, I get a response code 403 which I guess means I'm trying to do something I don't have permission to do? How can I get rid of this issue so I can create users?

Here is my tests.py:

from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APITestCase
from django.contrib.auth.models import User
from rest_framework import status

class TestUserApi(APITestCase):
    def setUp(self):
        self.test_user = User.objects.create_user('testuser', '[email protected]', 'testpassword')

        self.create_url = reverse('user-create')

    def test_create_user(self):
        data = {
            'username': 'foobar',
            'email': '[email protected]',
            'password': 'somepassword'
        }

        response = self.client.post(self.create_url , data, format='json')

        # We want to make sure we have two users in the database..
        self.assertEqual(User.objects.count(), 2)
        # And that we're returning a 201 created code.
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        # Additionally, we want to return the username and email upon successful creation.
        self.assertEqual(response.data['username'], data['username'])
        self.assertEqual(response.data['email'], data['email'])
        self.assertFalse('password' in response.data)

    def test_create_user_with_short_password(self):
        data = {
                'username': 'foobar',
                'email': '[email protected]',
                'password': 'foo'
        }

        response = self.client.post(self.create_url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(User.objects.count(), 1)
        self.assertEqual(len(response.data['password']), 1)

    def test_create_user_with_no_password(self):
        data = {
                'username': 'foobar',
                'email': '[email protected]',
                'password': ''
        }

        response = self.client.post(self.create_url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(User.objects.count(), 1)
        self.assertEqual(len(response.data['password']), 1)

My views.py:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from user_api.serializers import UserSerializer
from django.contrib.auth.models import User

class UserCreate(APIView):

    def post(self, request, format='json'):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            if user:
                return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

My serializers.py:

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

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(required=True, validators=[UniqueValidator(queryset=User.objects.all())])
    username = serializers.CharField(validators=[UniqueValidator(queryset=User.objects.all())])
    password = serializers.CharField(min_length=8, write_only=True)

    def create(self, validated_data):
        user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'])
        return user

    class Meta: 
        model = User
        fields = ('id', 'username', 'email', 'password')

My user_api/urls.py:

from django.conf.urls import url
from . import views
from django.urls import path, include

urlpatterns = [
    path('api/users/', views.UserCreate.as_view(), name='user-create'),
]

And my mexicantrain/urls.py:

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from scores import views
from django.conf.urls import url
# from user_api import views


router = routers.DefaultRouter()
router.register(r'players', views.PlayersView, 'players')
router.register(r'Games', views.GamesView, 'Games')
router.register(r'Rounds', views.RoundsView, 'Rounds')
router.register(r'PlayerRounds', views.PlayerRoundsView, 'PlayerRounds')
router.register(r'PlayerRounds', views.PlayerRoundsView, 'PlayerRounds')


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('frontend.urls')),
    path('api/', include(router.urls)),
    path('', include('user_api.urls')),
]

I'm not really sure how to even go about fixing this. Any help would be appreciated. Also, here is the output when I run my tests(https://i.stack.imgur.com/Ui4Ov.png)

0

There are 0 best solutions below