Метод "POST" не разрешен в Django Rest Framework - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать службу отдыха, совместимую с JSON API, используя JSON API Django Rest Framework: https://django -rest-framework-json-api.readthedocs.io / о / стабильный / 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')),
]

привратник / 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)),
]

привратник / 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')

привратник / serializers.py

from rest_framework import serializers
from .models import Greeter


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

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

привратник / 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.

Я открыл отдельный вопрос, чтобы получить руководство по этому вопросу, чтобы пометить его как ответивший.

В Django, как вы храните конфигурации URL-адресов модуля внутри модуля?

Еще раз спасибо за помощь:)

1 Ответ

0 голосов
/ 07 сентября 2018

Добавьте префикс API к вашему URL-адресу include as,

urlpatterns = [
    url(<b>r'sample',</b> include(ROUTER.urls)),
]


Таким образом, ваша конечная точка будет /greeters/sample/ для list-api (HTTP GET) и создать api (HTTP POST)

...