2015-06-16 2 views
1

У меня есть служба, в которую мне нужно загрузить контент, и сервер начинает отправлять ответ после получения определенного количества данных, в то время как мой объект запроса все еще загружается.Python запрашивает ответ при загрузке тела запроса

headers = {'Content-Type': 'application/octet-stream', 'Expect': '100-continue', 'Connection' :'keep-alive'} 
url = "https://MY_API_URL/WEBSERVICE" 
response = requests.put(url, headers=headers,stream=True, data=data_gen(fh)) 
lines = response.iter_lines() 
for line in lines: 
    print line 

data_gen моя функция генератора, которая принимает дескриптор файла очень большого файла, который дает 4KB на одну итерацию.

Моя проблема в том, что я не получаю «отклик» до загрузки всего файла. Любые идеи о том, как я могу это преодолеть.

+0

Пожалуйста, попробуйте contextlib.closing отсюда - http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow –

+0

Возможно, в вашем ответе нет новой строки. Вы также можете попробовать 'для данных в response.iter_content (size):' – Mehdi

+0

Это также зависит от вашего веб-сервера. Может быть, он не обеспечивает статус выполнения во время загрузки? – Mehdi

ответ

1

Вы не можете выполнить это с помощью запросов сегодня. Запросы (и базовые библиотеки, включая httplib/http.client [в зависимости от вашей версии Python]) все отправляют все данные, прежде чем они начнут читать ответ.

Одна библиотека, которая может быть в состоянии справиться с этим (на самом деле, я уверен, что это должно быть выполнимо с этим) - treq. Он использует Twisted, который должен дать вам способы определить, когда данные будут получены, поэтому все, что вам нужно сделать, это зарегистрировать обратный вызов, чтобы начать доступ к этим данным.

+0

Я собирался начать писать свои собственные запросы lib с помощью скрученных. Теперь, когда я знаю «treq», для меня это еще один элемент. Попробует и обновит. – sivchand

Смежные вопросы