2016-05-02 5 views
-1

Ich schreibe ein Skript, das eine POST-Anfrage an einen Server und blockiert wird der Server sendet die Antwort immer dann, wenn ein bestimmtes Ereignis ausgelöst wird. Ich muss ein Cookie für eine Post-Anfrage mit einer früheren Login-Anfrage nehmen und es als Daten an POST übergeben, jeder Cookie dauert 10 Minuten, nach dem ich eine Keep-Alive-Anfrage ausführen muss.Kontinuierliche Antwort der POST-Anfrage in Python

Immer wenn ein Ereignis ausgelöst wird, möchte ich dieses Ereignis in einer Datei protokollieren. Ich habe asynchrone, universelle Anfragen versucht, die Post-Anfrage generieren, aber ich habe keine Kontrolle über die Ausgabe, ich versuchte Sitzungen auch, aber nutzlos. Ich möchte folgende Dinge in derselben Reihenfolge tun

1] Anmeldung (kann nur einmal tun)

2] Stellen Sie die Anfrage an den Server

3] Überwachung Ausgabe von Schritt 2 ewig halten, wenn es etwas ist, Ausgabe log es in eine Datei

4] Halten Sie die Sitzung durch eine andere Anfrage an den Server lebendig.

Lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen.

Im Folgenden finden Sie Code, es funktioniert nicht, obwohl

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() 

So in obigem Code der Post Anruf, den ich hier machen blockiert und kontinuierlich an, die Ausgabe kontinuierlich Ströme, so dass der Post Anruf nie wirklich abgeschlossen wird. Aber es empfängt Ausgabe im XML-Format, Server sendet diese Antworten jedes Mal, wenn ein Ereignis ausgelöst wird.

PS: Ich will nicht, logout tun und wieder anmelden, das funktioniert in curl, wo es Druckausgabe auf stdout hält, muss ich für mehrere Server diesen Code ausführen wie 200.

+0

Ich habe nicht verstanden, was Sie eigentlich wollen. Bitte stellen Sie die Frage klar, um schneller Hilfe zu erhalten. –

+0

Geben Sie einen Code ein. –

+0

Was passiert, wenn Sie 'stream = True 'setzen und [r.iter_lines] (http://docs.python-requests.org/en/master/api/#requests.Response.iter_lines) verwenden? –

Antwort

0

I behoben haben Dieses Problem mit zwei Ebenen Threading und Lesen von Chunks anstelle von Inhalt oder read_lines(). 1] Erste Threads werden erstellt, die einen zweiten Thread generieren und Keepalive ausführen, wenn ein Timeout eintritt.

2] Der zweite Thread abonniert ein Ereignis mit einer POST-Anforderung und hört dann immer Stücke der Größe 1024 ab, sobald eine Antwort empfangen wird, wird geparst und die entsprechenden Daten werden aktualisiert. Hier habe ich Anfragen mit Stream = True verwendet; Das funktionierte für mich früher nicht, da Cookie vor dem Lesen der Antwort abläuft und die Sitzung zum Schließen verwendet wird.

Wenn jemand eine bessere Möglichkeit hat dies zu tun, bitte hier aktualisieren.