【问题标题】:Django Rest Framework - POST request invokes GET request (localhost)Django Rest Framework - POST 请求调用 GET 请求(本地主机)
【发布时间】:2019-05-04 06:51:37
【问题描述】:

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

【问题讨论】:

  • 不应该articles.create(articles.objects.create(
  • @RedCricket 我会解决这个问题,但这似乎不是问题。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您可以创建 get_serailzer() 方法,使用该方法可以获得带有 JSON 和 HTML 表单的可浏览 API,通过该方法可以执行 POST 操作。

    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

    【讨论】:

      【解决方案3】:

      解决方案:我在末尾使用了斜杠,而当我发送请求时,我没有在末尾添加斜杠。所以我简单地从 django urls 中删除了结束斜杠

      【讨论】:

        猜你喜欢
        • 2023-01-08
        • 2020-11-09
        • 2018-12-22
        • 1970-01-01
        • 2020-08-26
        • 2019-01-07
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        相关资源
        最近更新 更多