【问题标题】:Django Rest Framework, returns 405 on POSTDjango Rest 框架,在 POST 上返回 405
【发布时间】:2016-04-29 15:47:33
【问题描述】:

从 DRF v3.0 升级到 v3.3.2 后,我在尝试使用 POST 方法创建模型时收到 405(不允许方法)。

我无法在调试器上捕获请求以找出问题所在。

我在 Project/settings.py 中的 DRF 设置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGINATE_BY'             : 10
}

我在 project/urls.py 中的 urlpatterns

urlpatterns = [
    ...
    url(r'^api/v1/seeds/', include('seed.urls')),
    ...
    url('^.*$', IndexView.as_view(), name='index')
]

我在 project/seed/urls.py 中的 urlpatterns:

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

router = routers.SimpleRouter()
router.register(r'^', SeedViewSet)

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

我的项目/seed/views.py

from seed.serializers import SeedSerializer
from seed.models import Seed
from rest_framework import viewsets

class SeedViewSet(viewsets.ModelViewSet):
    queryset = Seed.objects.all()
    serializer_class = SeedSerializer
    # permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
        return super(SeedViewSet, self).perform_create(serializer)

我的项目/seed/serializer.py

from authentication.serializers import AccountSerializer
from rest_framework import serializers
from seed.models import Seed


class SeedSerializer(serializers.ModelSerializer):
    user = AccountSerializer(read_only=True, required=False)

    class Meta:
        model = Seed
        fields = ('id', 'user', 'jobs', 'list_name', 'proxyType', 'created_at', 'updated_at')
        read_only_fields = ('id', 'user', 'jobs', 'created_at', 'updated_at')

我做错了什么? 还是因为升级而我应该做不同的事情?

编辑 我正在使用 angularJs 发布到 API,这是我的服务中的函数:

function create(list_name, proxyType) {
    return $http.post('/api/v1/seeds/', {
    list_name: list_name,
    proxyType: proxyType
    });
}

【问题讨论】:

  • 你能用失败的 python rest_framework 测试重新创建错误吗?如果是这样,您能否将失败的测试代码添加到问题中,以便更清楚发生了什么。
  • 对我来说,你应该有一个 create 方法而不是 perform_create 因为 create 属于 ModelViewSetperform_create 属于 GenericAPIView 但这只是一个猜测
  • @AaronLelevier,你能告诉我怎么做吗?

标签: python angularjs django python-3.x django-rest-framework


【解决方案1】:
from rest_framework.decorators import list_route

请使用下面的帖子。

@list_route(methods=['post'])
def perform_create(self, request):
        serializer.save(user=self.request.user)
        return super(SeedViewSet, self).perform_create(serializer)

【讨论】:

    【解决方案2】:

    我将 SeedViewSet 从 viewsets.ModelViewSet 更改为 generics.ListCreateAPIView,然后我覆盖了 post(self, request, *args, **kwargs) 方法并且它起作用了。

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 2016-01-10
      • 2018-06-30
      • 1970-01-01
      • 2021-01-14
      • 2019-05-04
      • 2015-04-26
      • 2017-08-21
      相关资源
      最近更新 更多