首页 > 解决方案 > Django Rest Framework - POST 请求调用 GET 请求(本地主机)

问题描述

当我尝试访问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'

网址.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'),
]

视图.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 中切换位置时,​​我收到此retrieve错误。create"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'),
]

标签: djangorestpostdjango-rest-frameworkrequest

解决方案


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

在此处输入图像描述

你的第二个网址模式是正确的。因为如果你保留<pk>/before ,当你实际调用 create 方法时create/,django 会解释你正在调用<pk>/(应该是<int:pk>)带有参数的 url (这是一个字符串)。create当它试图将其转换为整数时(因为主键是一个自动字段),它会抛出invalid literal for int() with base 10: 'create'异常。


推荐阅读