2

我一直在尝试学习 Solr4.0,我正在查看他们 文档中的 JSON 文档更新,如下所示:

cd example/exampledocs
curl 'http://localhost:8983/solr/update/json?commit=true' --data-binary @books.json -H 'Content-type:application/json'

它工作正常,我可以在我的 solr 索引上看到更新的文档。但是,我想知道如何通过 urllib2 在 python 中使用这个 curl 命令。所以,像:

theurl=r"""http://localhost:8983/solr/update/json?commit=true --data-binary @books.json -H 'Content-type:application/json'"""
import urllib2
import httplib
import cookielib
...use urllib2 to post theurl

但是,这不起作用。看起来 urllib2 无法识别(例如-H明显看起来特定于 curl 的)上面形成的theurl. 应该如何格式化theurl以便我可以将它与 urllib2 一起使用?

4

2 回答 2

5

我会尝试

import urllib2
with open('books.json', 'rb') as data_file:
    my_data = data_file.read()
req = urllib2.Request(url='http://localhost:8983/solr/update/json?commit=true',
                      data=my_data)
req.add_header('Content-type', 'application/json')
f = urllib2.urlopen(req)
# Begin using data like the following
print f.read()

从这里你可以看到 --data-binary 参数只是像POST请求一样发送到服务器的数据。当该参数以@ 符号开头时,表示从文件中读取数据。在这种情况下,它是文件“books.json”。您还需要发送标头(的-H参数curl)。因此,您只需要add_header使用标头名称及其值来调用该方法。

希望这能让你开始。有关 urllib2 的更多信息,请访问http://docs.python.org/2/library/urllib2.html

于 2013-03-17T12:37:23.170 回答
0

因为 urllib2 在 Python 3.x 中不可用,所以我提供了这个替代方案。这个代码片段使用 Python 3.3 和优秀的requests库为我工作

 import requests

 def postXml(host, xmlFile):
     url = "http://%s:8983/solr/update" % host
     headers = {"content-type" : "text/xml" }
     params = {"commit" : "false" }
     payload = open(xmlFile, "rb").read()
     r = requests.post(url, data=payload, params=params,  headers=headers)
     print("got back: %s" % r.text)
于 2014-07-15T17:31:24.550 回答