gpt4 book ai didi

python - rest_framework coreapi 不支持 PUT/PATCH 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:20 24 4
gpt4 key购买 nike

我想使用 Python Client Library ,但是让 PUT/PATCH 工作没有尽头。每当我尝试使用 update/partial_update 时,URL 参数都不是从字典中插入的,并且服务器返回 404。

[06-Jun-2017 12:30:05] WARNING [django.server:124] "PUT /api/accounts/networks/%7Bcid%7D/ HTTP/1.1" 404 23

这清楚地表明 {cid} 参数从未被替换为实际值。这让我想到了我的问题的 TL/DR 版本,CoreAPI 不支持 PUT/PATCH 吗?

PUT/PATCH 选项已根据以下信息正确设置:

GET /api/accounts/networks/2892c424-3a86-16bb-8b60-12a79900e90c/
HTTP 200 OK
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
"url": "http://localhost:8000/api/accounts/networks/2892c424-3a86-16bb-8b60-12a79900e8fb/",
"created": "2016-04-16T19:35:02.169898Z",
"modified": "2017-05-30T17:25:29.768740Z",
"cid": "2892c424-3a86-16bb-8b60-12a79900e8fb",
"name": "10.0.0.0/8",
"comments": "Local Area Network - 10.x",
"builtin": true
}

现在我花了一个上午的大部分时间来尝试完成这项工作,我意识到有 no documentation example显示更新/部分更新。

所以我想我会尝试使用 coreapi-cli,但我遇到了同样的问题。

coreapi action networks partial_update --param cid='2892c424-3a86-16bb-8b60-12a79900e8fb' --param comments='this is WAAAY too hard'
<Error: 404 Not Found>
detail: "Not found."

Django 的日志行显示 URL 参数从未被提供的“cid”参数替换:

[06-Jun-2017 13:07:01] WARNING [django.server:124] "PUT /api/accounts/networks/%7Bcid%7D/ HTTP/1.1" 404 23

我可以使用覆盖参数来强制 URL,现在它会按预期更新。

client.action(['networks', 'partial_update'],
params={'comments': 'this is WAAAY too hard', 'cid': '2892c424-3a86-16bb-8b60-12a79900e8fb'},
overrides={'url': 'http://localhost:8000/api/accounts/networks/2892c424-3a86-16bb-8b60-12a79900e8fb/'},
)

但这感觉很笨拙,应该完全没有必要。所以……

  1. 这是一个错误吗?
  2. 我是不是弄错了函数签名?
  3. CoreAPI 不支持 PUT/PATCH 方法吗?

编辑

这是 View 集

class LCModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
Base ModelViewSet
"""
lookup_field = 'cid'



class NetworksViewSet(LCModelViewSet):
queryset = Networks.objects.all()
serializer_class = NetworksSerializer
filter_class = NetworksFilter

和路由器

router = DefaultRouter()
router.register(r'accounts/networks', av.NetworksViewSet, base_name='api-networks')

和 router.routes 的输出

[Route(url='^{prefix}{trailing_slash}$', mapping={'get': 'list', 'post': 'create'}, name='{basename}-list', initkwargs={'suffix': 'List'}),
DynamicListRoute(url='^{prefix}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}),
Route(url='^{prefix}/{lookup}{trailing_slash}$', mapping={'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, name='{basename}-detail', initkwargs={'suffix': 'Instance'}),
DynamicDetailRoute(url='^{prefix}/{lookup}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={})]

编辑 #2

在 hurturk 的建议下,我将所有内容都减少为默认值 - views.ModelViewsetserializers.ModelSerializer,并将 lookup_field 放在 WebView 集。还是一样的问题。

然后我删除了自定义查找字段并尝试使用默认的 id 字段(cid 不是 PK),然后 VOILA,PUT/PATCH 工作了 - URL正确生成!所以,我想知道是否出于某种原因这是一个与 UUID 相关的问题。

因为 name 是一个唯一字段,所以我设置了 lookup_field = name。与 UUID 相同的行为。 GET/POST 方法有效。 PUT/PATCH 不要 "PATCH/api/accounts/networks/%7Bname%7D/HTTP/1.1"404 23

所以似乎是这样,当 lookup_field 是 PK 时,就会正确生成 PUT/PATCH url。当 lookup_field 是其他字段时,永远不会插入 URL lookup_field 占位符。

我不知道该怎么办。 CID 是必备条件...

最佳答案

嗯,我发现了问题。 :-) cid 必须设置为只读,然后 PUT/PATCH 的 URL 才能正确形成。

为什么 lookup_field 必须是只读的?如果让 lookup_field 可写是不正确且不可行的,则错误消息将非常有用,而不是当前的行为。

编辑

谢谢,@hurkurk!我没注意到你的PR !这确实解决了我的问题,至少在不需要编辑 cid 时是这样。将路径参数与请求数据分开指定真的很棒,这样可以在 PUT/PATCH 上更改 lookup_field 值。但那是另一个讨论。

关于python - rest_framework coreapi 不支持 PUT/PATCH 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com