我有一个Djasto应用程序,为REST设置了tastypie。
我希望能够使用REST API更新数据库。
我可以在命令行上发出一个curl命令来实现我想要的东西(根据tastypie文档)。
curl --dump-header - -H "Content-Type: application/json" -X PATCH --data '{"comments": "comment1"}' http://127.0.0.1:8000/api/seq/loadedwith/12092/
HTTP/1.0 202 ACCEPTED
Date: Fri, 26 Oct 2012 11:06:58 GMT
Server: WSGIServer/0.1 Python/2.6.6
Content-Type: text/html; charset=utf-8
所以现在我正在尝试使用请求模块实现相同的功能。从python请求模块获取请求,但我无法获得补丁或帖子。
url='http://127.0.0.1:8000/api/seq/loadedwith/12092/'
headers={'content-type': 'application/json'}
payload={"comments":"comment2"}
requests.patch(url=url, params=json.dumps(payload), headers=headers)
我收到错误:
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/requests-0.14.1-py2.7.egg/requests/api.py", line 120, in patch
return request('patch', url, data=data, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests-0.14.1-py2.7.egg/requests/safe_mode.py", line 39, in wrapped
return function(method, url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests-0.14.1-py2.7.egg/requests/api.py", line 51, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests-0.14.1-py2.7.egg/requests/sessions.py", line 182, in request
params=from_key_val_list(params),
File "/usr/local/lib/python2.7/dist-packages/requests-0.14.1-py2.7.egg/requests/utils.py", line 135, in from_key_val_list
raise ValueError('cannot encode objects that are not 2-tuples')
ValueError: cannot encode objects that are not 2-tuples
当我添加json.dumps(有效载荷)时,这似乎即将到来 - 我尝试只传递字典,但在这种情况下有效负载被添加到查询中,并且tastypie会抱怨。我已经尝试将字典格式化为元组,但我不确定它究竟是什么。
有人可以提供帮助,(或者我是否在代码中查找错误的位置)?
答案 0 :(得分:9)
params
应该始终是一个dict或一系列2值元组,然后为你编码。但是,您希望上传已编码的正文,因此您需要使用data
关键字:
requests.patch(url, data=json.dumps(payload), headers=headers)
事实上,data
是第二个参数,所以你甚至可以这样做:
requests.patch(url, json.dumps(payload), headers=headers)
因为您通常只使用PATCH发送不透明数据。 .post()
和.put()
方法的行为方式相同,第二个参数是data
关键字。