@api_view 方法不起作用,但 post 方法可以工作 django rest api

问题描述 投票:0回答:2

我已经导入了

django_restframework.decorators from api_view

@api_view(['POST'])
def post_cart(self,request):
    serializer = CartItemSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
    else:
        return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)


curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"1\"}"

当我使用

@api_view(['GET'])
时,我收到此错误

{
    "detail": "Method \"POST\" not allowed."
}
  

但是当我像这样改变时它就起作用了

def post(self,request):
    serializer = CartItemSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
    else:
        return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)



curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"1\"}"

返回成功200

{
    "status": "success",
    "data": {
        "id": 5,
        "product_name": "item",
        "product_price": 12.5,
        "product_quantity": 5
    }
}

购物车项目查看代码

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import CartItemSerializer
from .models import CartItem
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view

class CartItemViews(APIView):
    @api_view(['POST'])
    def post_cart(self,request):
        serializer = CartItemSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
        else:
            return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
    
    def get(self,request, id=None):
        if id:
            item = CartItem.objects.get(id=id)
            serializer = CartItemSerializer(item)
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
        items = CartItem.objects.all()
        serializer = CartItemSerializer(items, many=True)
        return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)

    def patch(self,request, id=None):
        if id:
            item = CartItem.objects.get(id=id)
            serializer = CartItemSerializer(item,data=request.data,partial=True)
            if serializer.is_valid():
               serializer.save()
               return Response({"status": "success", "data": serializer.data})
            else:
               return Response({"status": "error", "data": serializer.errors})

    def delete(self, request, id=None):
        item = get_object_or_404(CartItem, id=id)
        item.delete()
        return Response({"status": "success", "data": "Item Deleted"})

url.py

from django.urls import path
from .views import CartItemViews

urlpatterns = [
    path('cart-items/',CartItemViews.as_view()),
    path('cart-items/<int:id>', CartItemViews.as_view()),
]
python-3.x django django-rest-framework django-views
2个回答
0
投票

您不要在基于类的视图的成员上使用

@api_view(['POST'])
@ap_view(…)
装饰器[drf-doc]
将函数转换为基于类的视图,所以现在您的
post_cart
是类中的类。

可以使用以下方法将 POST 请求路由到未命名的方法

post
@action(…)
 [drf-doc]
:

from rest_framework.decorators import action


class CartItemViews(APIView):
    @action(methods=['post'], detail=False)
    def post_cart(self, request):
        # …
        pass

话虽如此,我不明白为什么使用

def post
在这里不起作用。


0
投票

仍然出现错误[14/Mar/2024 21:03:37]“POST /api/cart-items/ HTTP/1.1”405 41

您应该向

/api/cart/post_cart/
发出发布请求或在
 url_path='cart-items' and url_name='cart-items'
装饰器上设置
@action
链接

默认情况下,URL 模式基于方法名称,URL 名称是 ViewSet.basename 和连字符方法名称的组合。

© www.soinside.com 2019 - 2024. All rights reserved.