Mit Python "request data" definieren

Django, Flask, Bottle, WSGI, CGI…
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?
rofldofl
User
Beiträge: 11
Registriert: Donnerstag 9. November 2017, 09:00

@Sirius3
Sehr viel aber scheinbar nicht genug
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@rofldofl:
1. warum `before_request`? Du willst doch die Daten erst abarbeiten, wenn der Request komplett ist, damit du dann eine entsprechende Response schreiben kannst.
2. Was für eine Modul ist `xmltodic? Wohin die Daten da gehen -> RTFM
3. Wenn du die XML-Daten sowieso in eine Dict wandelts, kannst du auch direkt mit JSON arbeiten...
4. so wie von Sirius3 gezeigt würde ich es auch machen

Gruß, noisefloor
Antworten