- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用 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/'},
)
但这感觉很笨拙,应该完全没有必要。所以……
这是 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={})]
在 hurturk 的建议下,我将所有内容都减少为默认值 - views.ModelViewset
和 serializers.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/
我有一个 API 端点,它将使用 rest_framework 的 serializer.is_valid() 进行输入验证。它将返回自定义错误消息和响应。 serializer = FormSeri
我有一个名为 UserViewSet 的类: class UserViewSet(viewsets.ModelViewSet): queryset = UserData.objects.all
无法完成 rest_framework.authtoken 的迁移 Running migrations for authtoken: - Migrating forwards to 0001_ini
我注意到 Serializer 在拒绝带有未知字段的输入时并不是很严格: In [1]: from rest_framework import serializers In [2]: class Te
我正在尝试将我的 django 1.9 升级到 django 2.0。它对 GET() 工作正常,但在 POST() 中出现错误。我的 views.py 是:- class AccountInfoUp
这是一个简单的问题,但我对 django-rest-framework 很陌生。 我想知道是否有任何方法可以从序列化程序访问模型上定义的方法。? 说我有一个模型 class Listing(model
Django serializers 和有什么区别对比 rest_framework serializers ? 我制作了一个 webapp,我希望 API 成为项目创建的主要应用程序的一部分。不为
这是我的models.py的一部分: class Discount(models.Model): discount_id = models.AutoField(primary_key=True
在我的 View 函数中,我想返回一个 json 对象 (data1) 和一些文本/html(表单)。这可能吗? 我的代码 @api_view(['POST']) @permission_classe
当我按照 this tutorial 尝试使用 django rest 框架过滤器时出现错误.当我尝试导入库时出现错误: from django_filters.rest_framework impo
这是我的settings.py: INSTALLED_APPS = [ 'rest_framework', 'django.contrib.admin', 'django.co
我正在尝试创建一个继承自 permissions.BasePermission 的自定义权限类。我知道您可以覆盖自定义消息的 message 属性,但也可以覆盖 http 状态吗?我想为过期的链接返回
我怎样才能让 django 消息框架与 rest_framework 一起工作? 这是我的观点 @api_view(['GET', 'POST']) def myview(request):
我正在尝试为我的 Django REST API 设置 OAuth2 身份验证系统(使用 DjangoRestFramework 和 Django-Oauth-Toolkit)。我是按照官方文档写的,
我正在尝试运行 longclaw,但出现错误 $ python manage.py makemigrations catalog home Traceback (most recent call la
我正在尝试将几个文件发送到我的后端: class AccountsImporterTestCase(APITestCase): def test(self): data = [
我在 django docker 容器中的 virtualenv 中使用 pip 安装了带有 markdown 和 django filter 的 djangorestframework,通过 pip
我在 pythonanywhere.com 上部署我的应用程序时遇到问题。我已按照说明通过运行以下命令通过 pip 安装 teh django rest frameowrk 包 pip install
我有一个 API 需要以列表的形式返回一个 QuestionQueue 及其关联的 Question 对象。我让它工作得很好,它按照我想要的方式返回数据: class QuestionQueueSer
我是 Django 框架和 Django REST 框架的新手,但我可以运行基本设置和实现。当我为单个对象调用域时,它就像一个魅力,例如http://mydomain.com/location/1 (
我是一名优秀的程序员,十分优秀!