Подробно": "Метод \"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, такие как
В вашем 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'])
)