Seite 1 von 2
Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 09:21
von rofldofl
Hallo Leute,
ich bin noch neu in Python und habe eine Frage bezüglich eines HTTP requests von Script 1 an Script 2.
In meinem Fall ist Script 1 ein PHP Script welches via Curl ein XML File and Script 2 sendet.
Ich weiß wie ich die Daten von Script 1 an Script 2 sende jedoch nicht wie ich in Script 2 dass XML definiere.
Wenn ich die Frage unvollständig gestellt habe dürft ihr mich gerne korrigieren leider bin ich mit Python noch nicht so sehr vertraut.
Vielen Dank.
SCRIPT 1
[codebox=php file=Unbenannt.php]
$input_xml = "mypathtoxml/xml.xml";
$url = "
http://192.168.0.236/get.py";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS,
"xmlRequest=" . $input_xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
$data = curl_exec($ch);
curl_close($ch);
$array_data = json_decode(json_encode(simplexml_load_string($data)),
true);
[/code]
SCRIPT 2
Code: Alles auswählen
xmlpost = #XML Daten die von Script 1 nach Script 2 gesendet wurden
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 10:25
von sls
Hallo rofldofl,
was hast du denn in deinem zweiten Script sonst noch definiert, um den HTTP-Post zu empfangen? `xmlpost` trifft es ja als Bezeichner auch nicht ganz richtig, denn du willst hier doch das XML empfangen, und nicht senden.
Oder geht es dir rein darum, wie du in Script zwei den XML-Response parsen kannst?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 11:54
von Sirius3
@rofldofl: ich verstehe nicht, wie Skript1 und Skript2 zusammenhängen. Skript1 ließt von irgendeiner Adresse XML-Daten und macht dann nichts sinnvolles damit. Skript2 macht gar nichts. Also, was soll Skript1 machen und was soll Skript2 machen?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 12:51
von rofldofl
Hallo Kollegen,
vielen Dank für die Antworten. Ich habe wohl die Frage nicht vollständig gestellt.
Script 2 arbeitet mit dem XML File von Script 1 weiter.
Was mit dem XML mache funktioniert schon jedoch weiß ich nicht wie ich das XML parsen kann und definieren kann.
Ich habe gehofft dass mir hierzu jemand helfen kann.
Wenn ich immer noch was falsch ausgedrückt habe weißt mich gerne darauf hin.
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 13:01
von Sirius3
@rofldofl: Script1 liest ein XML und wandelt es nach JSON und dann wieder in PHP-Strukturen. Wo kommt da Script2 ins Spiel?
Oder Script2 liest XML über eine URL ein und verarbeitet das weiter, aber was soll dann Script1?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 13:59
von noisefloor
Hallo,
nach meinem Verständnis von Skript 1 liest dies doch eine XML-Datei, sendet die XML-Daten als POST-Request an eine URL und wandelt die Antwort des Servers nach JSON um.
Skript 2 erscheint nach alle, was du bisher gesagt hast: überflüssig.
Du schweigst dich aktuell noch darüber aus a) wie die Daten überhaupt an Skript 2 gehen soll (Netzerwerk, Datei, Datenbank, Skript 2 wird aus Skript 1 aufgerufen, ...), b) wie die Daten überhaupt aussehen und c) was meinst du mit "XML definieren"?
Grundsätzlich hat Python diverse Module zum Arbeiten mit XML an Bord. Im allgemeinen lautet die Empfehlung aber, das externe Modul lxml zu nehmen, weil es eine schönere API hat und damit einfacher zu nutzen ist.
Gruß, noisefloor
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 19:00
von rofldofl
Script 1ist aus dem öffentlichen Netz erreichbar. Da script 2 auf einem internen Server liegt und nur der Server von Script 2 hinter bestimmte Firewalls sehen kann ist es notwendig dass ich von script 1 eine datei nach script 2 sende.
Mein Problem ist dass ich nicht weiß wie ich in script 2 die gesendete Datei parsen und definieren kann um mit dieser Datei weiter zu arbeiten.
Bedeutet also Script2 wird mit dem Request von script 1 gestartet.
Aufgezeichnet:
1. script 1 wird über dass Internet aufgerufen und erhält vom User daten
2. script 1 generiert ein xml aus den userdaten
3. Script 1 sendet dass xml an Script2
4. Script 2 soll mit den xml daten von script 1 weiter arbeiten
Ich weiß nur nicht wie ich in Python Script2 die xml Daten annehmen kann
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 19:09
von noisefloor
Hallo,
Script 1 sendet dass xml an Script2
WIE denn? Von der Sendemethode hängst natürlich auch ab, wie die Daten einzulesen sind...
Ich weiß nur nicht wie ich in Python Script2 die xml Daten annehmen kann
XML ist doch auch einfach nur platter Text (mit einem bestimmten Markup)....
Das einfachste wäre IMHO, dass Skript 1 die Daten in eine Datei schreibt die Skript 2 dann liest. Sollte ja ohne Probleme funktionieren, da beide Skripte auf dem gleichen Rechner laufen.
Gruß, noisefloor
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 19:37
von rofldofl
noisefloor hat geschrieben:Hallo,
Script 1 sendet dass xml an Script2
WIE denn? Von der Sendemethode hängst natürlich auch ab, wie die Daten einz..
Die Daten werden über einen http request gesendet.
Und die scripts liegen nicht auf dem selben Server

Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 19:40
von Sirius3
@rofldofl: was sind das für Userdaten und warum werden die nach XML verwandelt? Warum leitest Du die Anfrage nicht einfach direkt an den zweiten Server weiter?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 19:44
von rofldofl
Sirius3 hat geschrieben:@rofldofl: was sind das für Userdaten und warum werden die nach XML verwandelt? Warum leitest Du die Anfrage nicht einfach direkt an den zweiten Server weiter?
Dass wird in xml gewandelt weil die Userdaten klar definiert werden mussten und nicht immer dass selbe Muster enthalten.
Xml ist für mich zwingend erforderlich.
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 20:26
von noisefloor
Hallo,
gut, du sendest die Daten per HTTP POST Request an den Server, aus dem Skript zwei läuft. Verarbeitet der Software, der die Daten empfängt, diese direkt (aka: Skript 2 empfängt den POST Request selber?) oder müssen die auf dem Server nochmal von den empfangenden Software ans Skript weiter gegeben werden? Welche Software / welches Webframework empfängt die Daten? Das extrahieren von POST-Daten aus dem Request sollte ja easy sein.
Dass wird in xml gewandelt weil die Userdaten klar definiert werden mussten und nicht immer dass selbe Muster enthalten.
Das ist noch nicht wirklich ein Grund für XML...Das geht z.B. auch mit JSON (was einfacher weiter zu verarbeiten ist).
Xml ist für mich zwingend erforderlich.
Nun gut, dann ist das hier so.
Gruß, noisefloor
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 21:29
von rofldofl
noisefloor hat geschrieben:Hallo,
gut, du sendest die Daten per HTTP POST Request an den Server, aus dem Skript zwei läuft. Verarbeitet der Software, der die Daten empfängt, diese direkt (aka: Skript 2 empfängt den POST Request selber?) oder müssen die auf dem Server nochmal von den empfangenden Software ans Skript weiter gegeben werden? Welche Software / welches Webframework empfängt die Daten? Das extrahieren von POST-Daten aus dem Request sollte ja easy sein.
Gruß, noisefloor
Die Zieladresse an die die Daten gesendet werden sollen ist Script2 selbst.
Auf der Zieladresse läuft ein NGINX Webserver mit WSGI Application auf dem Script 2 ausgeführt wird.
Ja Script 2 empfängt den POST Request selber
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 21:36
von noisefloor
Hallo,
gut - aber wo ist dann das Problem? Wie du das XML aus dem POST-Request "raus" bekommst, steht sicher in der Doku des von dir eingesetzten Webframeworks (dessen Namen du uns immer noch verschweigst).
Wie man XML mit Python verarbeitet bzw. welche Module man dafür nimmt habe ich in einem vorherigen Post schon gesagt. Wenn du damit Probleme hast, müsstest du a) mal ein Beispiel deines XML geben b) sagen, was konkret "verarbeitet" werden soll und c) sagen, welches Modul du für XML nutzt.
Gruß, noisefloor
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 21:37
von Sirius3
@rofldofl: und welches Framework benutzt Du?
Der Code, den Du im ersten Post gezeigt hast, hat ja nichts mit dem was Du jetzt beschreibst. Kannst Du Code posten, den Du versucht hast und was passiert dort?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 21:54
von rofldofl
Puh mit Fragen hab ich es nicht so
Ich habe nicht dass Gefühl dass meine Frage verstanden wurde deswegen bitte ich euch mir die Folgende zu beantworten dann weiß ich was ich wissen muss.
Folgendes ist Script 1 von Server 1 mit der IP 192.168.100.234 (ich habe es mal in Python geschrieben (script1 spielt für mich zuerst keine Rolle))
Code: Alles auswählen
def frame_xml(AddressVerified,AmountPaid):
xml_data = """<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/ metadata" xmlns="http://www.w3.org/2005/Atom">
<category scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" term="SS.WebData.Order" />
<title />
<POST>here_i_am</POST>
<id />
<content type="application/xml">
<m:properties>
<d:AddressVerified m:type="Edm.Byte">%s</d:AddressVerified>
<d:AmountPaid m:type="Edm.Decimal">%s</d:AmountPaid>
</m:properties>
</content>
</entry>"""%(AddressVerified,AmountPaid)
return xml_data
headers = {'Content-Type': 'application/xml'}
xml_data = frame_xml('AddressVerified','AmountPaid')
print requests.post('http://192.168.0.125/randalone/brd-app/script2.py', data=xml_data, headers=headers).text
Meinem Minimalen Verständnis von Python ist dass ein Request den ich an
http://192.168.0.125/randalone/brd-app/script2.py sende.
Meine neue Frage ist folgende:
Wie müsste script2.py aussehen wenn ich
Script1 als Response eine txt Datei mit dem Inhalt "JA" geben möchte sollte in der XML der POST den Inhalt "here_i_am" enthalten
und wenn nicht dann den Statuscode 444
Und um die Frage die wahrscheinlich gleich wieder kommt zu beantworten ich benutze in Script 2 kein Framework da Script2 keiene visuelle Darstellung benötigt.
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 22:09
von noisefloor
Hallo,
Richtig. Was du aber denke ich falsch verstehst: du sendest so _nicht_ an script2.py. Du hast lediglich `skript2.py` in der URL und das bedeutet erst mal: nichts.
Du musst auf 192.168.0.125 einen Server (Server im Software-Sinne, nicht Hardware) laufen haben, der auf der URL `randalone/brd-app/script2.py` lauscht und den POST-Request entgegen nimmt. Das macht man üblicherweise mit einem der vielen verfügbaren Python Webframeworks. Im gegebenen Fall wäre Bottle oder Flask ein geeignetes Framework. Oder auch Hug.
Gruß, noisefloor
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 22:13
von rofldofl
Ooh ja ich habe flask auf dem Server von script 2.
Nach was muss ich denn bei flask suchen wenn ich dass so haben möchte?
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 22:22
von Sirius3
@rofldofl: was hast Du denn an Dokumentation gelesen ??
Code: Alles auswählen
@app.route('/randalone/brd-app/script2.py', methods=['POST'])
def read_xml():
xml = ElementTree.fromstring(request.data)
[...]
XML erzeugt man übrigens nicht per Stringformatierung, sondern aus einem XML-Tree.
Re: Mit Python "request data" definieren
Verfasst: Donnerstag 9. November 2017, 22:23
von rofldofl
Code: Alles auswählen
import xmltodict
@app.before_request
def before_request():
print xmltodict.parse(request.data)['xml']['POST']
Würde ich so die Ausgabe der xml erhalten?