Django Rest Framework 不允许使用方法 "POST"
Method "POST" not allowed with Django Rest Framework
我正在尝试使用 Django Rest Framework JSON API 创建一个 JSON API 兼容的休息服务:
https://django-rest-framework-json-api.readthedocs.io/en/stable/index.html
我想我停留在 Django Rest Framework 级别,但我不确定。
我认为 GET 请求有效,但 POST 无效,因为我收到以下响应:
$ 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"
}
]
}
但是 GET 没问题:
$ curl -H 'Accept: application/vnd.api+json; indent=2' http://localhost:8000/greeters/
{
"data": {}
}
我查看了其他帖子和教程,似乎我在我的代码中遗漏了一些没有突然出现的东西。希望它会出现在对 Djang 和 Django Rest Framework 有更多经验的其他人身上。
感谢您的宝贵时间:)
这是我的代码:
my_project/urls.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')),
]
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)),
]
greeter/views.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')
greeter/serializers.py
from rest_framework import serializers
from .models import Greeter
class GreeterSerializer(serializers.HyperlinkedModelSerializer):
"""Define Greeter serializer"""
class Meta:
model = Greeter
fields = ('message')
greeter/models.py
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
并将所有 url 配置移到了 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)),
]
它有效,但我仍然想了解如何将所有欢迎程序 url 代码推送到欢迎程序文件夹内的文件中,例如 greeter/urls.py
.
我已经打开了一个单独的问题来获得这方面的指导,所以我可以将其标记为已回答。
再次感谢大家的帮助:)
添加一些 API 前缀 到您的 url 包含语句,
urlpatterns = [
url(<b>r'sample',</b> include(ROUTER.urls)),
]
因此,您的终点将是 /greeters/sample/
for list-api (HTTP GET) 并创建 api (HTTP POST)
我正在尝试使用 Django Rest Framework JSON API 创建一个 JSON API 兼容的休息服务: https://django-rest-framework-json-api.readthedocs.io/en/stable/index.html
我想我停留在 Django Rest Framework 级别,但我不确定。
我认为 GET 请求有效,但 POST 无效,因为我收到以下响应:
$ 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"
}
]
}
但是 GET 没问题:
$ curl -H 'Accept: application/vnd.api+json; indent=2' http://localhost:8000/greeters/
{
"data": {}
}
我查看了其他帖子和教程,似乎我在我的代码中遗漏了一些没有突然出现的东西。希望它会出现在对 Djang 和 Django Rest Framework 有更多经验的其他人身上。
感谢您的宝贵时间:)
这是我的代码:
my_project/urls.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')),
]
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)),
]
greeter/views.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')
greeter/serializers.py
from rest_framework import serializers
from .models import Greeter
class GreeterSerializer(serializers.HyperlinkedModelSerializer):
"""Define Greeter serializer"""
class Meta:
model = Greeter
fields = ('message')
greeter/models.py
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
并将所有 url 配置移到了 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)),
]
它有效,但我仍然想了解如何将所有欢迎程序 url 代码推送到欢迎程序文件夹内的文件中,例如 greeter/urls.py
.
我已经打开了一个单独的问题来获得这方面的指导,所以我可以将其标记为已回答。
再次感谢大家的帮助:)
添加一些 API 前缀 到您的 url 包含语句,
urlpatterns = [
url(<b>r'sample',</b> include(ROUTER.urls)),
]
因此,您的终点将是 /greeters/sample/
for list-api (HTTP GET) 并创建 api (HTTP POST)