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)