Подробно": "Метод \"GET\" не разрешен. | Django Rest Framework

Я прохожу курс по входу и регистрации пользователей и получаю эту ошибку и не знаю, как ее исправить 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)

Я не уверен, в этом ли проблема, но я видел, как кто-то сказал, что поскольку в views.py у меня есть представление как @api_view(['POST']), я не могу вызвать его в urls.py, как я обычно делаю. Я бы проверил это, но я не знаю другого способа сделать это

Поскольку ваш api настроен на прием только метода POST, вы не можете просто ввести URL в браузер. api_view(['POST'])

Попробуйте запустить API в postman, используя метод POST

https://www.django-rest-framework.org/api-guide/views/#api_view

или добавьте это

@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)

Как говорит ошибка, ваш API регистра должен быть POST, а не GET.

Если вы вызываете API вашего регистра с помощью метода GET, возникает описанная выше ошибка.

Вы можете просто протестировать его с помощью команды curl (при условии запуска сервера на порту 8000).


curl -X GET http://localhost:8000/users/register/ 

это вызовет ошибку "Метод не разрешен"


curl -d '{"name":"value1", "email":"value2", "password": "value3"}' \
  -X POST http://localhost:8000/users/register/

это будет работать нормально

При вызове через браузер по умолчанию используется метод GET. Для тестирования этих конечных точек путем предоставления соответствующих методов и данных можно использовать клиенты rest API, такие как

  1. POSTMAN
  2. .
  3. Громовой клиент, если вы используете VS CODE
  4. .
  5. curl способ ответа @fullswing, если вы хотите минимальную установку

В вашем api_view вы не используете метод GET, поэтому он выдает ошибку. Пожалуйста, используйте метод GET, и он должен работать. Посмотрите ниже для справки

@api_view(['GET','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'])
 )
Вернуться на верх