2013-03-17 2 views
1

Я пытался узнать Solr4.0, и я смотрю на обновление документа JSON в их documentation который выглядит следующим образом:Преобразовать Solr локон updateJSON синтаксис питона с помощью urllib2

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

Он отлично работает и я могу видеть обновленные документы по моему индексу solr. Тем не менее, мне было интересно, как я могу использовать эту команду curl в python через urllib2. Итак, что-то вроде:

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, который, очевидно, кажется завихряющимся), сформированный выше theurl. Как следует форматировать theurl, чтобы я мог использовать его с urllib2?

+0

вы можете дать StackTrace? – ennuikiller

+0

Итак, когда я открываю 'http: // localhost: 8983/solr/update/json? Commit = true --data-binary @ books.json -H 'Content-type: application/json'' с' urllib2' I get: 'urllib2.HTTPError: HTTP Ошибка 400: Плохой запрос' Я не думаю, что urllib2 понимает этот бит:' --data-binary @ books.json -H 'Content-type: application/json'' – JasonB

ответ

4

Я хотел бы попробовать

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 двоичный параметр только данные, отправленные на сервер, как в POST запросе. Когда этот параметр начинается с знака @, это означает чтение данных из файла. В этом случае это файл «books.json». Вам также необходимо отправить заголовок (параметр -Hcurl). Поэтому вам нужно только вызвать метод add_header с именем заголовка и его значением.

Надеюсь, что вы начнете. Более подробную информацию о urllib2 можно найти по адресу: http://docs.python.org/2/library/urllib2.html

+0

Я думаю, что это close, но теперь я получаю 500 ошибок: 'urllib2.HTTPError: ошибка HTTP 500: ошибка трассировки сервера включена: http: //dpaste.com/1025608/ Я уверен, что это как-то связано с форматом URL-адреса , – JasonB

+0

Да, я забыл, что знак @ означал чтение из файла ... работа над исправлением этого ... – ToddR

+0

Большое спасибо. Я пробовал это в течение последних 3 часов, но не добился успеха. странно, что нет правильной библиотеки python для curl, к которой я могу просто передать эти параметры. – JasonB

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) 
Смежные вопросы