无法发布到 Django REST API

Posted

技术标签:

【中文标题】无法发布到 Django REST API【英文标题】:Not able to post to Django REST API 【发布时间】:2020-06-16 05:55:09 【问题描述】:

我想创建一个 ViewSet,它在执行 GET 请求时返回对象列表,如果是 POST 请求,它将执行该函数,并且只有在此之后才会返回此列表。 我在文档中这样做了,但是不允许接收该“帖子”。

views.py

class CloudViewSetHosts(viewsets.ModelViewSet):

    queryset = CloudModelHost.objects.all()
    serializer_class = CloudSerializerHosts

    @action(methods=['POST'], detail=True,
            url_path='autodiscovery', url_name='autodiscovery')
    def autodiscovery(self, request, requestDataName=None):

        ... 
        some actions
        ...

        return CloudModelHost.objects.all()

urls.py

router = routers.DefaultRouter()
router.register(r'hosts', CloudViewSetHosts)


urlpatterns = [
    path('', include(router.urls)),
]

然后卷起来:

curl -X POST  -H 'Accept: application/json; indent=4'

http://IP/api/hosts/test/ -vvv * 正在尝试 IP:80... * TCP_NODELAY 设置 * 连接到 IP (IP) 端口 80 (#0)

POST /api/hosts/test/HTTP/1.1 主机:IP 用户代理:curl/7.65.3 接受:应用程序/json;缩进=4

将捆绑包标记为不支持多用途 与主机 IP 的连接 #0 保持不变

【问题讨论】:

【参考方案1】:

尝试添加

http_method_names = ['post', ]

直接在查询集和序列化器赋值语句下:

    queryset = CloudModelHost.objects.all()
    serializer_class = CloudSerializerHosts
    http_method_names = ['post', ]

【讨论】:

感谢您的帮助,但没有帮助 相同的 405 HTTP 响应 好的,因为这是一个 POST 端点并且您已经设置了detail=True,所以您需要在 url 中包含一个 pk 值。所以尝试 curl api/hosts/test/pk 其中pk 是您尝试创建/发布的对象的 id/主键。如果您不需要或不需要 pk,请尝试 detail=False

以上是关于无法发布到 Django REST API的主要内容,如果未能解决你的问题,请参考以下文章

django rest api:JSON 解析错误 - 无法解码 JSON 对象

如何使用相关模型发布到 Django REST 框架 API

无法在 React 中呈现来自 REST API GET(在 Django 中管理)响应的数据

Django Rest 框架:XMLHttpRequest 无法加载 http://127.0.0.1:8000/xyz/api/abc

Django REST 框架:令牌身份验证不适用于生产

无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL