1

私はcouchdbで更新ハンドラーに取り組んでおり、この奇妙な問題に直面しています:

ここに私の更新ハンドラがあります:

"updates": {
       "temp": "function(doc, req) {var inc_amount =JSON.parse(req.query.amount);doc[1]=inc_amount;return [doc, JSON.stringify(inc_amount) + JSON.stringify({\"STATUS\": \"message\"})];}"
   },

これが私のcouchdbドキュメントです:

{
   "_id": "my_doc",
   "_rev": "51-62e63d1ba46abbe6678a6c57f5500782"
}

amountこのドキュメントをクエリ パラメータの値で更新したいと考えています。コマンドラインを使用してそれを行う方法は次のとおりです(基本的にcurl):

curl -X PUT http://localhost:5984/db/_design/designdoc/_update/temp/my_doc?amount='\{"a":\{"b":"c"\}\}'

このコマンドは私にとって完璧に機能します。しかし、この更新は python コードによって呼び出されるため、このようなことを行うための別subprocessの forは必要ありませcurlん。むしろ、Pythonic ソリューションを探しています。requestsモジュールを使用して達成しようとしたことは次のとおりです。

>>> import json
>>> d={'a':{'b':'c'}}
>>> d
{'a': {'b': 'c'}}
>>> s=json.dumps(d)
>>> s
'{"a": {"b": "c"}}'
>>> import requests
>>> r=requests.put('http://localhost:5984/file_status_collector/_design/reportsDesignDoc/_update/temp/my_doc', data = {'amount': s})
>>> r.status_code
500
>>> r.text
u'{"error":"render_error","reason":"function raised error: (new SyntaxError(\\"JSON.parse\\", \\"/opt/local/share/couchdb/server/main.js\\", 481)) \\nstacktrace: SyntaxError(\\"JSON.parse\\")@:0\\n(\\"undefined\\")@/opt/local/share/couchdb/server/main.js:481\\n([object Object],[object Object])@:0\\napply([object Object],[object Array])@:0\\nrunUpdate(function (doc, req) {var inc_amount = JSON.parse(req.query.amount);doc[1] = inc_amount;return [doc, JSON.stringify(inc_amount) + JSON.stringify({STATUS:\\"message\\"})];},[object Object],[object Array])@/opt/local/share/couchdb/server/main.js:952\\n(function (doc, req) {var inc_amount = JSON.parse(req.query.amount);doc[1] = inc_amount;return [doc, JSON.stringify(inc_amount) + JSON.stringify({STATUS:\\"message\\"})];},[object Object],[object Array])@/opt/local/share/couchdb/server/main.js:1021\\napply(null,[object Array])@:0\\n(\\"_design/reportsDesignDoc\\",[object Array],[object Array])@/opt/local/share/couchdb/server/main.js:1492\\napply(null,[object Array])@:0\\n()@/opt/local/share/couchdb/server/main.js:1535\\n@/opt/local/share/couchdb/server/main.js:1546\\n"}\n'

ここで私は問題に直面しました。そこで、json 文字列sを curl に与えた形式に変更することを考えました。

>>> s=s.replace(' ','').replace('{','\{').replace('}','\}')
>>> s
'\\{"a":\\{"b":"c"\\}\\}'
>>> print s
\{"a":\{"b":"c"\}\}
>>> r=requests.put('http://localhost:5984/file_status_collector/_design/reportsDesignDoc/_update/temp/my_doc', data = {'amount': s})
>>> r.status_code
500
>>> r.text
u'{"error":"render_error","reason":"function raised error: (new SyntaxError(\\"JSON.parse\\", \\"/opt/local/share/couchdb/server/main.js\\", 481)) \\nstacktrace: SyntaxError(\\"JSON.parse\\")@:0\\n(\\"undefined\\")@/opt/local/share/couchdb/server/main.js:481\\n([object Object],[object Object])@:0\\napply([object Object],[object Array])@:0\\nrunUpdate(function (doc, req) {var inc_amount = JSON.parse(req.query.amount);doc[1] = inc_amount;return [doc, JSON.stringify(inc_amount) + JSON.stringify({STATUS:\\"message\\"})];},[object Object],[object Array])@/opt/local/share/couchdb/server/main.js:952\\n(function (doc, req) {var inc_amount = JSON.parse(req.query.amount);doc[1] = inc_amount;return [doc, JSON.stringify(inc_amount) + JSON.stringify({STATUS:\\"message\\"})];},[object Object],[object Array])@/opt/local/share/couchdb/server/main.js:1021\\napply(null,[object Array])@:0\\n(\\"_design/reportsDesignDoc\\",[object Array],[object Array])@/opt/local/share/couchdb/server/main.js:1492\\napply(null,[object Array])@:0\\n()@/opt/local/share/couchdb/server/main.js:1535\\n@/opt/local/share/couchdb/server/main.js:1546\\n"}\n'

それでも助けにはならず、今は腕を置いています。Pythonic な方法でどのようにすればよいかわかりません。ここでは間違いなくあなたの助けが必要です。次の質問について教えてください。

  1. json をrequests.put正しく使用していますか? requests.putそのような要求を処理できますか? はいの場合、私の実装方法を修正してください。
4

0 に答える 0