5

REST用にtasticpieがセットアップされたDjangoアプリケーションがあります。

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

だから今、リクエストモジュールを使って同じことを達成しようとしています。Get requests は python requests モジュールから機能しますが、パッチや投稿を機能させることができません。

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(payload) を追加すると発生するようです - 辞書だけを渡そうとしましたが、その場合、ペイロードがクエリスティングに追加され、tastypie が文句を言います。辞書を tuple としてフォーマットしようとしましたが、それが正確に何を期待しているのかわかりません。

誰かが助けてくれますか (または、コード内の間違った場所を見ているのでしょうか)?

4

1 に答える 1

15

paramsは常に dict または 2 値タプルのシーケンスである必要があり、これらは後でエンコードされます。ただし、既にエンコードされた本文をアップロードしたいので、data代わりにキーワードが必要です。

requests.patch(url, data=json.dumps(payload), headers=headers)

実際、dataは 2 番目のパラメーターなので、次のようにすることもできます。

requests.patch(url, json.dumps(payload), headers=headers)

通常、PATCH を使用して不透明なデータのみを送信するためです。.post()メソッドとメソッドは.put()同じように動作します。2 番目のパラメーターはdataキーワードです。

于 2012-10-26T11:24:16.690 に答える