I'm following a course on user login and registration and I'm getting this error and I don't know how to fix it detail": "Method \"GET\" not allowed.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('users/login/', views.MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
path('users/register/', views.registerUser, name='register'),
path('users/profile/', views.getUserProfile, name="users-profile"),
path('users/', views.getUsers, name="users"),
]
views.py
@api_view(['POST'])
def registerUser(request):
data = request.data
user = User.objects.create(
first_name = data['name'],
username = data['email'],
email = data['email'],
password = make_password(data['password'])
)
serializer = UserSerializerWithToken(user, many=False)
return Response(serializer.data)
serializers.py
class UserSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField(read_only=True)
_id = serializers.SerializerMethodField(read_only=True)
isAdmin = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', "name", "isAdmin"]
def get__id(self, obj):
return obj.id
def get_isAdmin(self, obj):
return obj.is_staff
def get_name(self, obj):
name = obj.first_name
if name == '':
name = obj.email
return name
class UserSerializerWithToken(UserSerializer):
token = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', "name", "isAdmin", 'token']
def get_token(self, obj):
token = RefreshToken.for_user(obj)
return str(token.access_token)
I'm not sure if this is the problem but I saw someone who said that since in views.py I have the view as @api_view(['POST'])
I cant call it in urls.py the way I usually would. I would test that but I dont know of anyother way to do that
CodePudding user response:
As your api is set to accept only the POST method, you can't simply hit the URL into the browser. api_view(['POST'])
Try to run the API in postman using the POST method
https://www.django-rest-framework.org/api-guide/views/#api_view
or add this
@api_view(['POST', 'GET'])
def registerUser(request):
if request.method == 'GET':
return Response({'message': 'In get'})
data = request.data
user = User.objects.create(
first_name = data['name'],
username = data['email'],
email = data['email'],
password = make_password(data['password'])
)
serializer = UserSerializerWithToken(user, many=False)
return Response(serializer.data)
CodePudding user response:
As the error says, your register API should be POST
, not GET
.
If you call your register API with GET method, the above error occurs.
You can simply test it with curl
command (assuming runserver on port 8000).
curl -X GET http://localhost:8000/users/register/
this will caouse "Method not allowed" error
curl -d '{"name":"value1", "email":"value2", "password": "value3"}' \
-X POST http://localhost:8000/users/register/
this will work fine
CodePudding user response:
The default method is GET
when we call through the browser. To test these endpoints by giving appropriate methods and data is to use rest API clients like