======Auswertung von Formularen mit CGI====== Mit Hilfe von CGI lassen sich auch Webformulare auswerten. Das Formular kann dabei direkt in einer HTML-Datei stehen, es kann aber auch mit Hilfe einer Pythondatei durch CGI erzeugt werden. Dazu als erstes ein einfaches Beispiel: Zunächst erstellen wir in unserem Webserver-Verzeichnis die folgende HTML-Datei mit einem Formular: Python - CGI-Programmierung

Name:

Alter:

Happy Sad
Neu ist das Attribut ''%%action%%'' im ''%%
%%''-Tag. Es verweist auf das Script script03_auswertung.py, welches sich im Ordner cgi-bin befindet. Die Formulardaten werden nun als Werte von Variablen an dieses Script übermittelt. Das Script ist wie folgt aufgebaut: #!/usr/bin/env python3 import cgi header = ''' Python - CGI-Programmierung ''' footer = ''' ''' form = cgi.FieldStorage() print(header) if form.getvalue("name"): name = form.getvalue("name") print("

Hello " +name+"! Thanks for using my script!


") if form.getvalue("alter"): alter = int(form.getvalue("alter")) print("

In ten years, you will be",alter+10,"years old.

") if form.getvalue("happy"): print("

Yayy! I'm happy too!

") if form.getvalue("sad"): print("

Oh no! Why are you sad?

") print(footer)
Im Auswertungsscript wird nun eine Webseite erzeugt, die die Formulardaten auswertet. Der wichtigste Befehl zum Auswerten des Formulars ist das Importieren der CGI-Bibliothek ''%%import cgi%%'' Anschließend werden der Kopf- und der Fußquelltext der Seite als Variablen angelegt. Danach wird mit dem Befehl ''%%form = cgi.FieldStorage()%%'' aus der Bibliothek ''%%cgi%%''der Inhalt des Formulars in der Variable ''%%form%%'' gespeichert. Nun wird mit mehreren ''%%print%%''-Anweisungen der Seitenquelltext in Abhängigkeit vom Formularinhalt ausgegeben. Dabei kann mit ''%%form.getvalue(...)%%'' auf die jeweiligen Formularelemente zugegriffen werden. Als Argument wird der Name des Formularelements übergeben. Die Funktion gibt eine Zeichenkette, das ''%%value%%'' des Formulars zurück. Falls es kein ''%%value%%'' gibt, wird ''%%None%%'' zurückgegeben. **Aufgabe 1** Teste die Scripte. Lass dir weitere Formularelemente einfallen, die du dann auswertest. Das Ganze kann man auch in einer Datei zusammenfassen: #!/usr/bin/env python3 import cgi header = ''' Python - CGI-Programmierung ''' footer = ''' ''' form = cgi.FieldStorage() print(header) if form.getvalue("submit"): if form.getvalue("name"): name = form.getvalue("name") print("

Hello " +name+"! Thanks for using my script!


") if form.getvalue("alter"): alter = int(form.getvalue("alter")) print("

In ten years, you will be",alter+10,"years old.

") if form.getvalue("happy"): print("

Yayy! I'm happy too!

") if form.getvalue("sad"): print("

Oh no! Why are you sad?

") else: print("") print("

Name:

") print("

Alter:

") print(" Happy") print(" Sad") print("") print("") print(footer)
Wie funktioniert nun dieses Script? Im Prinzip ist der Aufbau ähnlich wie bei script03_auswertung.py. Der Unterschied ist, dass zunächst mit der if-Anweisung getestet wird, ob im Formularelement "submit" der Wert "Submit" übermittelt worden ist. Wenn das nicht der Fall ist, gab es noch kein Formular, welches ausgewertet werden konnte und nun wird im else-Zweig das Formular ausgegeben. Wenn ein Wert existiert, gab es ein Formular, welches ausgewertet wird (if-Zweig). **Aufgabe 2** Schreibe dein geändertes Script so um, dass es in einer Datei funktioniert. Ein komplexes Beispiel für ein Kopfrechenprogramm: #!/usr/bin/env python3 import cgi, cgitb, random cgitb.enable() header = ''' Python - CGI-Programmierung
''' footer = '''
''' form = cgi.FieldStorage() print(header) print("

Kopfrechnen

") if form.getvalue("config"): ro = form.getvalue("ro") anz = int(form.getvalue("anz")) opmin1 = int(form.getvalue("opmin1")) opmax1 = int(form.getvalue("opmax1")) opmin2 = int(form.getvalue("opmin2")) opmax2 = int(form.getvalue("opmax2")) print("
") print("") print("") if ro == 'Addition': print("

Addition

") for i in range(anz): a = random.randint(opmin1,opmax1) b = random.randint(opmin2,opmax2) print("

"+str(i+1)+". Aufgabe : "+str(a)+" + "+str(b)+" =

") print("") print("") elif ro == 'Subtraktion': print("

Subtraktion

") for i in range(anz): while(True): a = random.randint(opmin1,opmax1) b = random.randint(opmin2,opmax2) if a>b: break print("

"+str(i+1)+". Aufgabe : "+str(a)+" - "+str(b)+" =

") print("") print("") elif ro == 'Multiplikation': print("

Multiplikation

") for i in range(anz): a = random.randint(opmin1,opmax1) b = random.randint(opmin2,opmax2) print("

"+str(i+1)+". Aufgabe : "+str(a)+" * "+str(b)+" =

") print("") print("") elif ro == 'Division': print("

Division

") for i in range(anz): while(True): a = random.randint(opmin1,opmax1) b = random.randint(opmin2,opmax2) if a > b and a%b == 0 and b > 1: break print("

"+str(i+1)+". Aufgabe : "+str(a)+" : "+str(b)+" =

") print("") print("") print("

") print("Addition") for i in range(anz): if form.getvalue("ergebnis"+str(i+1)): e = int(form.getvalue("ergebnis"+str(i+1))) else: e = None a = int(form.getvalue("a"+str(i+1))) b = int(form.getvalue("b"+str(i+1))) if e == None: print("

",a,"+",b,"= - Ergebnis wurde nicht eingegeben! Richtiges Ergebnis:",a+b,"

") else: if e == a+b: print("

",a,"+",b,"=",e,"Richtig!

") else: print("

",a,"+",b,"=",e,"Falsch! Richtiges Ergebnis:",a+b,"

") elif ro == 'Subtraktion': print("

Subtraktion

") for i in range(anz): if form.getvalue("ergebnis"+str(i+1)): e = int(form.getvalue("ergebnis"+str(i+1))) else: e = None a = int(form.getvalue("a"+str(i+1))) b = int(form.getvalue("b"+str(i+1))) if e == None: print("

",a,"-",b,"= - Ergebnis wurde nicht eingegeben! Richtiges Ergebnis:",a-b,"

") else: if e == a-b: print("

",a,"-",b,"=",e,"Richtig!

") else: print("

",a,"-",b,"=",e,"Falsch! Richtiges Ergebnis:",a-b,"

") elif ro == 'Multiplikation': print("

Multiplikation

") for i in range(anz): if form.getvalue("ergebnis"+str(i+1)): e = int(form.getvalue("ergebnis"+str(i+1))) else: e = None a = int(form.getvalue("a"+str(i+1))) b = int(form.getvalue("b"+str(i+1))) if e == None: print("

",a,"*",b,"= - Ergebnis wurde nicht eingegeben! Richtiges Ergebnis:",a*b,"

") else: if e == a*b: print("

",a,"*",b,"=",e,"Richtig!

") else: print("

",a,"*",b,"=",e,"Falsch! Richtiges Ergebnis:",a*b,"

") elif ro == 'Division': print("

Division

") for i in range(anz): if form.getvalue("ergebnis"+str(i+1)): e = int(form.getvalue("ergebnis"+str(i+1))) else: e = None a = int(form.getvalue("a"+str(i+1))) b = int(form.getvalue("b"+str(i+1))) if e == None: print("

",a,":",b,"= - Ergebnis wurde nicht eingegeben! Richtiges Ergebnis:",a//b,"

") else: if e == a//b: print("

",a,":",b,"=",e,"Richtig!

") else: print("

",a,":",b,"=",e,"Falsch! Richtiges Ergebnis:",a//b,"

") print("") print("

") print("
") else: print("

Konfiguration

") print("
") print("""

Wähle die Rechennoperation!





Wie viele Aufgaben?

In welchem Bereich sollen die Operanden liegen?

MinimumMaximum
1. Operant
2. Operant

""") print("

") print(" **Aufgabe3** Teste das Script und versuche den Quelltext zu verstehen! Versuche ein ähnliches Programm mit anderen Aufgabeentypen zu schreiben.