我使用Django和 Django REST Framework 来实现 RESTful API 。
我现在拥有的:
ContentEntry
型号ContentEntryCreateUpdateSerializer
型号ContentEntry
序列化程序
ContentEntryCreate
视图以创建一些ContentEntry
ies ContentEntryUpdate
视图更新 ContentEntry
ies 以下是代码:
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
属性中看到的那样,服务器似乎只允许使用POST
和OPTIONS
方法。
由于generics.UpdateAPIView
定义了put
和patch
方法,因此非常奇怪。
我不认为这是一个许可问题,因为我允许所有内容:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
我应该怎样做以允许HTTP PATCH
和PUT
方法?
答案 0 :(得分:4)
请务必使用开头和结尾(^和$符号)标记网址。
这里发生的是没有结束标记,r'content-entry'
匹配“/ content-entry / 4 /”,因此调用创建视图。
使用:r'^content-entry$'
和r'^content-entry/(?P<id>\d+)$'
代替。