Mit Python "request data" definieren

Django, Flask, Bottle, WSGI, CGI…
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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?
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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 8)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

Puh mit Fragen hab ich es nicht so :D

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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

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?
Antworten