【问题标题】:Method "POST" not allowed with Django Rest FrameworkDjango Rest Framework 不允许使用方法“POST”
【发布时间】:2019-02-12 03:13:52
【问题描述】:

我正在尝试使用 Django Rest Framework JSON API 创建一个符合 JSON API 的休息服务: https://django-rest-framework-json-api.readthedocs.io/en/stable/index.html

我认为我被困在 Django Rest Framework 级别,但我不确定。

我认为 GET 请求有效,但 POST 不是因为我收到此响应:

$ curl -H 'Accept: application/vnd.api+json; indent=2' -X POST http://localhost:8000/greeters/
{
  "errors": [
    {
      "detail": "Method \"POST\" not allowed.",
      "source": {
        "pointer": "/data"
      },
      "status": "405"
    }
  ]
}

但是 GET 没问题:

$ curl -H 'Accept: application/vnd.api+json; indent=2' http://localhost:8000/greeters/
{
  "data": {}
}

我查看了其他帖子和教程,似乎我的代码中遗漏了一些没有出现在我身上的东西。希望它会出现在对 Djang 和 Django Rest Framework 有更多经验的其他人身上。

感谢您的宝贵时间:)

这是我的代码:

my_project/urls.py

from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^greeters/', include('greeter.urls')),
]

greeter/urls.py

from django.conf.urls import url, include
from rest_framework import routers
from .views import GreeterViewSet

ROUTER = routers.DefaultRouter()
ROUTER.register(r'^', GreeterViewSet)

urlpatterns = [
    url(r'^', include(ROUTER.urls)),
]

greeter/views.py

from rest_framework import viewsets
from .models import Greeter
from .serializers import GreeterSerializer


class GreeterViewSet(viewsets.ModelViewSet):
    """API endpoints for Greeter"""

    queryset = Greeter.objects.all()
    serializer_class = GreeterSerializer

    # I've tried adding these methods in but none of it worked
    #def perform_create(self, serializer):
    #    serializer.save(owner=self.request.user)

    #def create(self, request):
    #    print('#########create')

    #def post(self, request):
    #    print('#########post')

greeter/serializers.py

from rest_framework import serializers
from .models import Greeter


class GreeterSerializer(serializers.HyperlinkedModelSerializer):
    """Define Greeter serializer"""

    class Meta:
        model = Greeter
        fields = ('message')

greeter/models.py

from django.db import models


class Greeter(models.Model):
    """Define Greeter model"""
    id = models.CharField(
        primary_key=True,
        max_length=200
    )
    message = models.CharField(max_length=200)

更新:

感谢您的帮助。它引导我找到解决方案。

我删除了 greeter/urls.py 并将所有 url 配置移动到 my_project/urls.py

from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path
from rest_framework import routers
from greeter.views import GreeterViewSet

ROUTER = routers.DefaultRouter()
ROUTER.register(r'greeters', GreeterViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^', include(ROUTER.urls)),
]

它有效,但我仍然想了解如何将所有欢迎程序 url 代码推送到欢迎程序文件夹内的文件中,例如 greeter/urls.py

我已经打开了一个单独的问题来获得相关指导,因此我可以将其标记为已回答。

In Django, how do you keep a module's url configurations encapsulated inside the module?

再次感谢大家的帮助:)

【问题讨论】:

  • 你已经注释掉了你视图的post()方法...默认情况下,如果没有对应于HTTP请求方法的方法,Django REST将返回405。
  • @wpercy 这是为了帮助。我有一次没有注释这些方法中的每一个,但结果是一样的。我在那里列出了它以显示我尝试过的一些东西。还有什么我可能会丢失的吗?再次感谢您的帮助。
  • 我认为问题在于您的路由器中有一个空前缀;因此视图集的“根”视图的 URL 与列表/创建视图相同。尝试从基本 urls.py 中删除“greeters”前缀并将其用作路由器前缀。
  • 感谢@DanielRoseman 的帮助。如果没有示例代码,我不太明白你在说什么,但我的错误在于你提到的一般领域。我添加了一个更新,其中包含有效的代码。我仍然不确定如何保留 2 个单独的 urls.py 文件。再次感谢:)

标签: python django django-rest-framework json-api


【解决方案1】:

将一些 API 前缀 添加到您的 url 包含语句中,

urlpatterns = [
    url(r'sample', include(ROUTER.urls)),
]


因此,您的端点将是 /greeters/sample/ 用于 list-api (HTTP GET) 并创建 api (HTTP POST)

【讨论】:

猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2018-12-22
  • 2021-04-05
  • 1970-01-01
  • 2017-07-16
  • 2019-05-04
  • 2017-03-23
相关资源
最近更新 更多