Django-rest-framework IF statement in post method is not executing
Question:
(I will provide full code at the bottom)
I am trying to create an API view with django rest framework. I wanted to create a login API so I was first testing out on how to check if a data exists in a field in the database. Here are the "fields = values" that I want to check that actually exists in the database:
-
pengerja_id
= 123 //correct data
-
password
= 123
Now for example I want to try inputting the wrong value:
-
pengerja_id
= 555 //wrong data
-
password
= 555
Now, I run an if queryset.exists()
statement. Whenever I gave pengerja_id
a wrong value like ‘555’ it executes the else
statement as queryset
returns false
. But whenever I gave it the correct value of ‘123’, It fails to execute the WHOLE code for some reason starting from if serializer.is_valid()
.
Here is the code inside view.py
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
pengerja_id = serializer.data.get('pengerja_id')
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
if queryset.exists():
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
Here is the code inside serializers.py
class AuthorizeMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id', 'password')
The results are whenever I entered ‘123’ it gives me the HTTP_400_BAD_REQUEST
. Whenever I entered something else for example ‘555’, it gives me the HTTP_404_NOT_FOUND
response which means the else
statement works.
This is what I’ve tried so far:
First is to print out to check which block of code that isn’t executed when I passed in the correct value of pengerja_id = ‘123’ from my database.
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
print(f'serializer_class={self.serializer_class}') # this is executed
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
print(serializer.is_valid()) # this is not executed
pengerja_id = str(serializer.data.get('pengerja_id'))
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
print('Checking queryset exists()')
print(queryset.query)
if queryset.exists():
print("User Verified")
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
print('not found')
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
Everything from print(serializer.is_valid())
below is not executed. But if I gave in the value of ‘555’(wrong value) everything is executed until return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
.
Here is the output in the terminal.
Value of anything else other than ‘123’ output
So what went wrong here? Is it some kind of bug that django has or am I missing something here?
This is the full code below
models.py
from django.db import models
import mysql.connector
# Create your models here.
class COOL_YOUTH_MEMBER(models.Model):
pengerja_id = models.CharField(max_length=255, unique=True, primary_key=True)
nomor_telepon = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255)
nama_cool = models.CharField(max_length=255)
tempat_lahir = models.CharField(max_length=255)
tanggal_lahir = models.DateField(null=True)
status_pekerjaan = models.CharField(max_length=255)
domisili = models.CharField(max_length=255)
user_session_key = models.CharField(max_length=255, null=True)
serializers.py
from rest_framework import serializers
from .models import COOL_YOUTH_MEMBER
class ShowMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id','nomor_telepon','password','nama_cool','tempat_lahir',
'tanggal_lahir', 'status_pekerjaan', 'domisili', 'user_session_key')
class InsertNewMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id','nomor_telepon','password')
# ,'nama_cool','tempat_lahir',
# 'tanggal_lahir', 'status_pekerjaan', 'domisili')
class AuthorizeMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id', 'password')
views.py
from django.shortcuts import render
from django.contrib.auth.backends import BaseBackend
from rest_framework import generics, status
from .serializers import (
ShowMemberSerializer,
InsertNewMemberSerializer,
AuthorizeMemberSerializer
)
from .models import COOL_YOUTH_MEMBER
from rest_framework.views import APIView
from rest_framework.response import Response
# Create your views here.
# def index(request, *args, **kwargs):
# return render(request, index.html)
class ShowMemberView(generics.ListAPIView):
queryset = COOL_YOUTH_MEMBER.objects.all()
serializer_class = ShowMemberSerializer
class InsertNewMemberView(APIView):
serializer_class = InsertNewMemberSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
pengerja_id = serializer.data.get('pengerja_id')
nomor_telepon = serializer.data.get('nomor_telepon')
password = serializer.data.get('password')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
if not queryset.exists():
db = COOL_YOUTH_MEMBER(
pengerja_id = pengerja_id,
nomor_telepon = nomor_telepon,
password = password,
)
# db.nama_cool = ''
# db.tempat_lahir = ''
# db.tanggal_lahir = ''
# db.status_pekerjaan = ''
# db.domisili =''
db.save()
return Response(ShowMemberSerializer(db).data, status=status.HTTP_202_ACCEPTED)
else:
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Page not valid'}, status=status.HTTP_400_BAD_REQUEST)
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
print(f'serializer_class={self.serializer_class}')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
print(serializer.is_valid())
pengerja_id = str(serializer.data.get('pengerja_id'))
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
print('Checking queryset exists()')
print(queryset.query)
if queryset.exists():
print("User Verified")
# db = queryset[0]
# db.pengerja_id = pengerja_id
# db.password = password
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
print('not found')
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
urls.py
from django.urls import path
from .views import (
ShowMemberView,
InsertNewMemberView,
AuthorizeMemberView,
)
urlpatterns = [
path('show', ShowMemberView.as_view()),
path('new-member', InsertNewMemberView.as_view()),
path('authorize', AuthorizeMemberView.as_view()),
]
Also the class InsertNewMemberView
works just fine. Code is almost the same.
Answers:
Before if serializer.is_valid()
try this to know what the error is:
print(serialzer.errors)
It will return a dictionary with the errors
(I will provide full code at the bottom)
I am trying to create an API view with django rest framework. I wanted to create a login API so I was first testing out on how to check if a data exists in a field in the database. Here are the "fields = values" that I want to check that actually exists in the database:
-
pengerja_id
= 123 //correct data -
password
= 123
Now for example I want to try inputting the wrong value:
-
pengerja_id
= 555 //wrong data -
password
= 555
Now, I run an if queryset.exists()
statement. Whenever I gave pengerja_id
a wrong value like ‘555’ it executes the else
statement as queryset
returns false
. But whenever I gave it the correct value of ‘123’, It fails to execute the WHOLE code for some reason starting from if serializer.is_valid()
.
Here is the code inside view.py
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
pengerja_id = serializer.data.get('pengerja_id')
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
if queryset.exists():
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
Here is the code inside serializers.py
class AuthorizeMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id', 'password')
The results are whenever I entered ‘123’ it gives me the HTTP_400_BAD_REQUEST
. Whenever I entered something else for example ‘555’, it gives me the HTTP_404_NOT_FOUND
response which means the else
statement works.
This is what I’ve tried so far:
First is to print out to check which block of code that isn’t executed when I passed in the correct value of pengerja_id = ‘123’ from my database.
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
print(f'serializer_class={self.serializer_class}') # this is executed
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
print(serializer.is_valid()) # this is not executed
pengerja_id = str(serializer.data.get('pengerja_id'))
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
print('Checking queryset exists()')
print(queryset.query)
if queryset.exists():
print("User Verified")
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
print('not found')
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
Everything from print(serializer.is_valid())
below is not executed. But if I gave in the value of ‘555’(wrong value) everything is executed until return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
.
Here is the output in the terminal.
Value of anything else other than ‘123’ output
So what went wrong here? Is it some kind of bug that django has or am I missing something here?
This is the full code below
models.py
from django.db import models
import mysql.connector
# Create your models here.
class COOL_YOUTH_MEMBER(models.Model):
pengerja_id = models.CharField(max_length=255, unique=True, primary_key=True)
nomor_telepon = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255)
nama_cool = models.CharField(max_length=255)
tempat_lahir = models.CharField(max_length=255)
tanggal_lahir = models.DateField(null=True)
status_pekerjaan = models.CharField(max_length=255)
domisili = models.CharField(max_length=255)
user_session_key = models.CharField(max_length=255, null=True)
serializers.py
from rest_framework import serializers
from .models import COOL_YOUTH_MEMBER
class ShowMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id','nomor_telepon','password','nama_cool','tempat_lahir',
'tanggal_lahir', 'status_pekerjaan', 'domisili', 'user_session_key')
class InsertNewMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id','nomor_telepon','password')
# ,'nama_cool','tempat_lahir',
# 'tanggal_lahir', 'status_pekerjaan', 'domisili')
class AuthorizeMemberSerializer(serializers.ModelSerializer):
class Meta:
model = COOL_YOUTH_MEMBER
fields = ('pengerja_id', 'password')
views.py
from django.shortcuts import render
from django.contrib.auth.backends import BaseBackend
from rest_framework import generics, status
from .serializers import (
ShowMemberSerializer,
InsertNewMemberSerializer,
AuthorizeMemberSerializer
)
from .models import COOL_YOUTH_MEMBER
from rest_framework.views import APIView
from rest_framework.response import Response
# Create your views here.
# def index(request, *args, **kwargs):
# return render(request, index.html)
class ShowMemberView(generics.ListAPIView):
queryset = COOL_YOUTH_MEMBER.objects.all()
serializer_class = ShowMemberSerializer
class InsertNewMemberView(APIView):
serializer_class = InsertNewMemberSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
pengerja_id = serializer.data.get('pengerja_id')
nomor_telepon = serializer.data.get('nomor_telepon')
password = serializer.data.get('password')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
if not queryset.exists():
db = COOL_YOUTH_MEMBER(
pengerja_id = pengerja_id,
nomor_telepon = nomor_telepon,
password = password,
)
# db.nama_cool = ''
# db.tempat_lahir = ''
# db.tanggal_lahir = ''
# db.status_pekerjaan = ''
# db.domisili =''
db.save()
return Response(ShowMemberSerializer(db).data, status=status.HTTP_202_ACCEPTED)
else:
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Page not valid'}, status=status.HTTP_400_BAD_REQUEST)
class AuthorizeMemberView(APIView):
serializer_class = AuthorizeMemberSerializer
def post(self, request, format=None):
print(f'serializer_class={self.serializer_class}')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
print(serializer.is_valid())
pengerja_id = str(serializer.data.get('pengerja_id'))
password = serializer.data.get('password')
print(f'pengerja_id={pengerja_id}, password={password}')
queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
print('Checking queryset exists()')
print(queryset.query)
if queryset.exists():
print("User Verified")
# db = queryset[0]
# db.pengerja_id = pengerja_id
# db.password = password
return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
else:
print('not found')
return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
urls.py
from django.urls import path
from .views import (
ShowMemberView,
InsertNewMemberView,
AuthorizeMemberView,
)
urlpatterns = [
path('show', ShowMemberView.as_view()),
path('new-member', InsertNewMemberView.as_view()),
path('authorize', AuthorizeMemberView.as_view()),
]
Also the class InsertNewMemberView
works just fine. Code is almost the same.
Before if serializer.is_valid()
try this to know what the error is:
print(serialzer.errors)
It will return a dictionary with the errors