python - UpdateAPIView 不工作 : Method "PATCH" not allowed

标签 python django rest django-rest-framework

我使用 Django 和 Django REST Framework 来实现 RESTful API

我现在拥有的:

  • ContentEntry 模型
  • 用于我的 ContentEntry 模型的 ContentEntryCreateUpdateSerializer 序列化程序
  • ContentEntryCreate View ,用于创建一些ContentEntryies
  • ContentEntryUpdate View 以更新 ContentEntryies

代码如下:

from django.db import models
from rest_framework import serializers
from rest_framework import generics
from rest_framework.views import APIView
from my_api_app import views


# models.py
class ContentEntry(models.Model):
    content = models.ForeignKey(Content)
    quantity = models.IntegerField()
    container = models.ForeignKey(Container, related_name='content_entries')


# serializers.py
class ContentEntryCreateUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContentEntry
        fields = ('id', 'content', 'quantity', 'container')


# views.py
class ContentEntryCreate(generics.CreateAPIView):
    queryset = ContentEntry.objects.all()
    serializer_class = ContentEntryCreateUpdateSerializer


# views.py
class ContentEntryUpdate(generics.UpdateAPIView):
    queryset = ContentEntry.objects.all()
    lookup_field = 'id'
    serializer_class = ContentEntryCreateUpdateSerializer


# urls.py
urlpatterns = [
    url(r'content-entry', views.ContentEntryCreate.as_view()),
    url(r'content-entry/(?P<id>\d+)$', views.ContentEntryUpdate.as_view()),
]

除了总是返回错误的 ContentEntryUpdate 之外,一切正常:

HTTP/1.1 405 Method Not Allowed
Allow: POST, OPTIONS
Content-Type: application/json
Date: Wed, 03 May 2017 14:40:03 GMT
Server: WSGIServer/0.2 CPython/3.6.1
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

{"detail":"Method \"PATCH\" not allowed."}

正如您在Allow 属性中看到的,服务器似乎只允许POSTOPTIONS 方法。

这很奇怪,因为 generics.UpdateAPIView 定义了 putpatch 方法。

我不认为这是一个权限问题,因为我允许一切:

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny'
    ]
}

我应该怎么做才能允许 HTTP PATCHPUT 方法

最佳答案

请确保用开始和结束(^ 和 $ 符号)标记 URL。

这里发生的是没有结束标记,r'content-entry'匹配“/content-entry/4/”,因此调用创建 View 。

使用:r'^content-entry$'r'^content-entry/(?P<id>\d+)$'相反。

关于python - UpdateAPIView 不工作 : Method "PATCH" not allowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43764094/

相关文章:

python - 如何有效地过滤具有任意长度元组作为键的字典?

javascript - 如何正确处理 REST API 的路由

django - 如何从 Django CMS Placeholder 中的插件访问模板 block

javascript - select 返回零行,尽管它应该返回一些条目

java - 如何在 Controller 中传递多个参数?

python - 使用 'if... or' 语句迭代两个列表

python - API 使用错误请求错误消息进行响应

javascript - 如何在 Django 模型表单中包含日期选择器?

带 Stripe 的 Python/Django : Error in Post request in creating stripe subscription

python - 如何使 Django 自定义管理命令参数不需要?