Django Rest Framework-POST请求调用GET请求(localhost)

时间:2018-12-03 00:19:17

标签: django rest post django-rest-framework request

当我尝试访问http://localhost:8000/api/articles/时,效果很好。

当我尝试访问http://localhost:8000/api/articles/1时,效果很好。

当我尝试访问http://localhost:8000/api/articles/create时,Django认为我正在尝试执行GET请求('get': 'retrieve')。我在做什么错了?

错误 invalid literal for int() with base 10: 'create'

urls.py

urlpatterns = [
    path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
    path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
    path('create/', ArticleViewSet.as_view({'post': 'create'}) ,name='create'),
]

views.py

class ArticleViewSet(ViewSet):
    queryset = Article.objects.all()

    def list(self, request):
        articles = query_filter(request, ArticleViewSet.queryset)
        serializer = ArticleSerializer(articles, many=True)
        articles = formatter(serializer.data)
        return Response(articles)

    def retrieve(self, request, pk=None):
        article = get_object_or_404(ArticleViewSet.queryset, pk=pk)
        serializer = ArticleSerializer(article, many=False)
        article = formatter([serializer.data])
        return Response(article)

    def create(self, request):
        articles = ArticleViewSet.queryset
        articles.create(title=request.data['title'], body=request.data['body'])
        article = articles.last()
        serializer = ArticleSerializer(article, many=False)
        article = formatter([serializer.data])
        return Response(article)

另外,当我在如下所示的urlpatterns中切换retrievecreate的位置时,也会收到此错误"detail": "Method \"GET\" not allowed."

urlpatterns = [
    path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
    path('create/', ArticleViewSet.as_view({'post': 'create'}), name='create'),
    path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
]

2 个答案:

答案 0 :(得分:2)

尝试使用http://localhost:8000/api/articles/create时,实际上是在发出GET请求。这就是为什么您看到错误("detail": "Method \"GET\" not allowed.".)的原因。如果要发出发布请求,则需要使用postman之类的api工具。如果您使用邮递员,请尝试以下操作:

enter image description here

您的第二个网址格式正确。因为如果您将<pk>/放在create/之前,则django会解释您正在使用参数<pk>/(是字符串)调用<int:pk>(应为create)url。 ,当您实际调用create方法时。并且当它尝试将其转换为整数(因为主键是一个自动字段)时,它抛出invalid literal for int() with base 10: 'create'异常。

答案 1 :(得分:1)

Create方法不支持get操作,这就是您收到错误{"detail": "Method \"GET\" not allowed."}的原因。或者,您可以尝试 ModelViewset ,它提供默认的create()retrieve()update()partial_update()destroy()list()动作。

您可以创建 get_serailzer()方法,使用该方法可以通过POST操作获得具有JSON和HTML格式的可浏览API。

class ArticleViewSet(viewsets.ViewSet):
    queryset = Article.objects.all()

    def get_serializer(self, *args, **kwargs):
        return ArticleSerializer(*args, **kwargs)

    def create(self, request, *args, **kwargs):
        articles = ArticleViewSet.queryset
        articles.create(title=request.data['title'], body=request.data['body'])
        article = articles.last()
        **serializer = self.get_serializer(article, many=False)**
        from pyreadline.logger import formatter
        article = formatter([serializer.data])
        return Response(article)

Browsable API Image