Gui*_*TeK 4 python django rest django-rest-framework
我使用 Django 和Django REST Framework来实现RESTful API。
我现在所拥有的:
ContentEntry
模型ContentEntryCreateUpdateSerializer
我的ContentEntry
模型序列化程序ContentEntryCreate
视图中创建一些ContentEntry
IESContentEntryUpdate
视图更新的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()),
]
Run Code Online (Sandbox Code Playgroud)
一切正常,除了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."}
Run Code Online (Sandbox Code Playgroud)
正如您在Allow
属性中看到的,似乎只有POST
和OPTIONS
服务器允许方法。
这很奇怪,因为generics.UpdateAPIView
定义了put
和patch
方法。
我不认为这是一个许可问题,因为我允许一切:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能允许 HTTPPATCH
和PUT
方法?
请确保用开始和结束(^ 和 $ 符号)标记 URL。
这里发生的事情是没有结束标记,r'content-entry'
匹配“/content-entry/4/”并因此调用创建视图。
使用:r'^content-entry$'
和r'^content-entry/(?P<id>\d+)$'
代替。
归档时间: |
|
查看次数: |
10354 次 |
最近记录: |