代码之家  ›  专栏  ›  技术社区  ›  Zhao Li

Django Rest框架不允许使用方法“POST”

  •  -2
  • Zhao Li  · 技术社区  · 8 年前

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

    我认为GET请求是有效的,但帖子并不是因为我得到了这样的回复:

    $ 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"
        }
      ]
    }
    

    但是得到是好的:

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

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

    感谢您抽出时间:)

    这是我的密码:

    我的\u项目/网址.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')),
    ]
    

    迎宾员/网址.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)),
    ]
    

    迎宾员/视图.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')
    

    迎宾员/序列化程序.py

    from rest_framework import serializers
    from .models import Greeter
    
    
    class GreeterSerializer(serializers.HyperlinkedModelSerializer):
        """Define Greeter serializer"""
    
        class Meta:
            model = Greeter
            fields = ('message')
    

    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 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)),
    ]
    

    迎宾员/网址.py .

    我已经打开了一个单独的问题,以获得指导,所以我可以标记为回答这个问题。

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

    再次感谢您的帮助:)

    1 回复  |  直到 8 年前
        1
  •  2
  •   JPG    8 年前

    添加一些 到您的url包含声明为,

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


    所以你的终点是, /greeters/sample/ for list api(httpget)和create api(httppost)