详细信息": "方法 \ 不允许"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方法,因此您不能简单地在浏览器中键入URLapi_view(['POST'])

尝试使用POST方法在postman中运行API

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

如果你用GET方法调用寄存器API,就会出现上面的错误。

您可以简单地使用curl命令进行测试(假设runserver在端口8000上)。


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

这将导致"方法不允许"误差


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

this will work fine

当我们通过浏览器调用时,默认方法是GET。通过提供适当的方法和数据来测试这些端点的方法是使用rest API客户机,如

  1. 邮差
  2. 雷霆客户端如果你使用VS CODE
  3. 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'])
)

最新更新