2016-05-02 3 views
-1

Я пишу скрипт, который выполняет POST-запрос на сервер и блокируется, сервер отправляет ответ при возникновении определенного события. Я должен взять cookie для отправки запроса с более ранним запросом на вход и передать его как данные в POST, каждый файл cookie длится 10 минут, после чего я должен запустить запрос keep-alive.Получите непрерывный отклик запроса POST в python

При каждом запуске какого-либо события я хочу зарегистрировать это событие в файле, я попробовал async, unirest запросы, которые они генерируют почтовый запрос, но у меня нет контроля над выходом, я также пробовал сеансы, но бесполезно. Я хочу сделать следующие вещи в том же порядке

1] Вход (можно сделать только один раз)

2] Опубликовать запрос на сервер

3] Держите выход мониторинга шага 2 вечно всякий раз, когда есть некоторые выход запишите его в файл

4] Держите сеанс в активном состоянии другим запросом на сервер.

Дайте мне знать, если вам нужно больше объяснений.

Ниже код, он не работает, хотя

while True: 
    try: 
     xmldata = "<eventSubscribe cookie=\"%s\" />" % (self.cookie) 
     r = requests.post(post_url,data=xmldata,stream=False,verify=False,timeout=10) 
     write_to_file('Ok',r.text) 
     unsubevents() 
     logout() 
    except Exception as e: 
     print e 
     self.write_to_file('Ok',"") 
    self.login() 

Таким образом, в коде выше пост вызова я делаю здесь, блокирует и непрерывен, потоки вывода непрерывно, так что после вызова никогда не будет завершена. Но он получает вывод в формате xml, сервер отправляет эти ответы каждый раз при срабатывании события.

PS: Я не хочу, чтобы сделать выход из системы и снова войти в систему, это работает в завиток, где он держит выход печати на стандартный вывод, я должен запустить этот код для нескольких серверов, как 200.

+0

Я не понимал, чего вы на самом деле хотите. Пожалуйста, сделайте вопрос понятным, чтобы быстрее получить помощь. –

+0

Опубликовать код. –

+0

Что делать, если вы устанавливаете 'stream = True' и используете [r.iter_lines] (http://docs.python-requests.org/en/master/api/#requests.Response.iter_lines)? –

ответ

0

Я исправил эта проблема с двухуровневыми потоками и фрагментами чтения вместо содержимого или read_lines(). 1] Создаются первые потоки, которые будут порождать второй поток и запускать keepalive, когда удары таймаута.

2] Второй поток подписывается на событие с запросом POST, а затем продолжает прослушивать куски размером 1024 каждый раз, когда получен ответ, обрабатывается и обновляются соответствующие данные. Здесь я использовал запросы с Stream = True; Это не работало для меня раньше, потому что cookie раньше истекал, прежде чем читать ответ и сеанс, используемые для закрытия.

Если у кого-то есть лучший способ сделать это, пожалуйста, обновите здесь.

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