CGI og dynamiske web-sider Uge 47 W. J. Chun: Core Python programming, kap 19.4-19.5. Kompendium.
I mål - næsten! Database Python - Webklient
Men først den mislykkede standup Skulle illustrere genbrug af designmønstre Jeg have lavet udskriftfunktionerne dumt.
Samlingsmønstret Rekursiv definition Samling ::= {Del}* Del ::= Simpel Samling Samling Del Del Samling Del Del
Specialisering af mønstret til beskrivelse af organisation Nye attributter Nye attributter Nye metoder Omdefinerede funktioner
Organisation class Organisation(Samling: def init (self, navn, adresse, leder, dele = None: Samling. init (self, navn, dele self.adresse = adresse self.leder = leder def ansaetleder(self,enansat: self.leder = enansat def fyrleder(self,enansat: self.leder = None def str (self, niveau = 1: text = '\n' + niveau *' '+'(' + self.navn text += '\n' + (niveau+1 *' '+ 'Leder: ' + self.leder. str (niveau+1 text += '\n' + (niveau+1 *' '+ 'Dele: ' if self.dele!= []: for endel in self.dele: text += endel. str (niveau+1 else: text += 'no parts' text += '\n' + niveau *' '+'' return text
Ansat class Ansat(Simpel: def init (self, navn, adresse, konto: Simpel. init (self, navn self.adresse = adresse self.konto = konto def str (self,niveau: text = '\n' + niveau *' '+'(' + self.navn text += '\n' + (niveau+1 *' '+ 'Adresse:' + self.adresse text += '\n' + (niveau+1 *' '+ 'Konto:' + self.konto text += '\n' + niveau *' '+'' return text
Kørsel #lav ledere steffen = Ansat('Steffen Brandorff','Horsens', '65656565' daimileder = Ansat('Kurt Jensen','Aarhus','545454' bodil = Ansat('Bodil Due','Vestergade 20', '32323232' natdekan = Ansat('Erik Meineche Schmidt','Aarhus','363636' sunddekan = Ansat('En eller anden','aarhus','et eller andet' rektor = Ansat('Lauritz B. Holm-Nielsen','Aarhus', '543636' #lav organisationer universitet = Organisation('Aarhus universitet','aarhus', rektor humaniora = Organisation('Humaniora', 'Nobelparken',bodil naturvidenskab = Organisation('Naturvidenskab', 'Ny Munkegade',natdekan sundvidenskab = Organisation('Sundhedsvidenskab', 'Bartolinsgade',sunddekan imv = Organisation('Imv','Helsingforsgade',steffen daimi = Organisation('Daimi','Aabogade',daimileder #tilfoej dele af organisationerne universitet.tilfoej(humaniora universitet.tilfoej(naturvidenskab universitet.tilfoej(sundvidenskab humaniora.tilfoej(imv naturvidenskab.tilfoej(daimi imv.tilfoej(claus imv.tilfoej(peter imv.tilfoej(steffen daimi.tilfoej(daimileder daimi.tilfoej(natdekan print universitet #lav ansatte claus = Ansat('Claus bossen','aarhus','6456445' peter = Ansat('Peter Bøgh Andersen','Rønde','4343434'
Output (Aarhus universitet Leder: (Lauritz B. Holm-Nielsen Adresse:Aarhus Konto:543636 Dele: (Humaniora Leder: (Bodil Due Adresse:Vestergade 20 Konto:32323232 Dele: (Imv Leder: (Steffen Brandorff Adresse:Horsens Konto:65656565 Dele: (Claus bossen Adresse:Aarhus Konto:6456445 (Peter Bøgh Andersen Adresse:Rønde Konto:4343434 (Steffen Brandorff Adresse:Horsens Konto:65656565 (Naturvidenskab Leder: (Erik Meineche Schmidt Adresse:Aarhus Konto:363636 Dele: (Daimi Leder: (Kurt Jensen Adresse:Aarhus Konto:545454 Dele: (Kurt Jensen Adresse:Aarhus Konto:545454 (Erik Meineche Schmidt Adresse:Aarhus Konto:363636 (Sundhedsvidenskab Leder: (En eller anden Adresse:Aarhus Konto:et eller andet Dele: no parts
De nye metoder humaniora.fyrleder(bodil humaniora.ansaetleder(steffen print humaniora (Humaniora Leder: (Steffen Brandorff Adresse:Horsens Konto:65656565 Dele: (Imv Leder: (Steffen Brandorff Adresse:Horsens Konto:65656565 Dele: (Claus bossen Adresse:Aarhus Konto:6456445 (Peter Bøgh Andersen Adresse:Rønde Konto:4343434 (Steffen Brandorff Adresse:Horsens Konto:65656565
CGI Common Gateway Interface Måde at afvikle programmer på serveren, hvor resultatet sendes tilbage til klienten (browseren Kræver at webserveren er sat op korrekt Alle programmeringssprog kan benyttes Mest kendt: Perl, Python
Afsendelse af meddelelser fra klient til server http://servernummer/pythonprogram? navn = værdi & navn = værdi http://www.sysiac.org/?pageid=16 http://www.google.dk/search? hl=da& q=cgi& btng=google-s%c3%b8gning& meta=
Dataflow
Forms <form name="form1" method="post" action="actionresult.py"> <p> <input type="submit" name="edit" value="ret"> <input type="submit" name="remove" value="udmeld"> <input type="text" name="cpr" value = 1111111111> </p> </form> Knapper (type submit. Name = det navn hvorunder data modtages af serveren, Value = den måde knappen fremvises på i klienten Felter (type text. Name = navnet på feltet, value = de data feltet indeholder. Method: den http kommando der skal bruges. Get/Post: videresender data på forskellig måde Action: det program der skal køres via cgi-protokollen
Test af cgi
Illustrerer http://imv.au.dk/~pba/homepagemateri al/programmeringsmateriale06/testside.htm Felter, menuer, radioknapper, checkboxe, upload of texter
HTML-koden Starten på form Text felt Menu Check box <form action="http://pba.web.student.hum.au.dk/fritidsordning/testresults.py" method="post" enctype="multipart/form-data" name="form1"> <p> <strong>name</strong> <input type="text" name="name"> <strong> </strong> <strong>address</strong> <input type="text" name="address"> </p> <p> <strong>choose color</strong> <select name="colorchoice"> <option value="green">green</option> <option value="blue">blue</option> <option value="red">red</option> </select> <strong> </strong> <strong>are you happy?</strong> <input type="checkbox" name="happy" value="true"> </p> <p>
HTML-koden Radio knapper Menu <label> <input type="radio" name="choose dish" value="fish"> Fish</label> <br> <label> <input type="radio" name="choose dish" value="meat"> Meat</label> <br> <label> <input type="radio" name="choose dish" value="bread"> Bread</label> </p> <h4>what do you want to do? <select name="task"> <option value="eat">eat dinner</option> <option value="sleep">go to sleep</option> <option value="work">go to work</option> </select> <br> </h4> <p> <input type="file" name="file"> </p> <p> <input name="postit" type="submit" id="postit" value="post http request"> </p> </form>
Test af cgi
FieldStorage storagecontents = cgi.fieldstorage( Kan behandles som en slags dictionary If address in astorage.keys: Addressen = astorage[ address ].value
Brug af testresults.py <form action=http://pba.web.student.hum.au.dk/fritidsordning/testresults.py method="post" enctype="multipart/form-data" name="form1"> Action = URL URL en refererer til dette Python-program der skal behandle de data form en sender til serveren. Brug af testresults.py Lav URL en om så den passer med jeres plads på serveren Læg python-programmet testresult.py over på jeres plads på serveren eller Brug brug det eksemplar der ligger på min serverplads Start med at lade alle sider aktivere testresult.py Så kan I se præcis hvilke data der fremsendes.
Gennemgang af eksempelsystemet
findresult.py Laver et objekt af klassen FindResult og printer den som htmltabel <form name="form1" method="post" action="findresult.py"> <p>cpr <input type="text" name="cpr"> </p> <p> <input type="submit" name="find" value="find"> </p> </form> Data sendt: cpr = 1111111 & find = find FindResult.py #!/usr/bin/python from dynamicwebpages import * if name == " main ": message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title print test.makedynamicpage( Placeringen af Python fortolkeren
Resultat
test = FindResult(beginning,ending,message,title
Hvordan sker det? def init (self, beginning, ending, message,title: ResultPage. init (self, beginning, ending, message,title self.results = self.getresults(
Hvordan sker det? def init (self, beginning, ending, message,title: self.beginning = beginning.replace('#message',message,1 self.beginning = self.beginning.replace('#title',title,1 self.ending = ending self.message = message self.storagecontents = cgi.fieldstorage(
Hvordan sker det? Har ingen anelse om hvad der sker
Hvordan sker det? class FindResult(ResultPage: def init (self, beginning, ending, message,title: ResultPage. init (self, beginning, ending, message,title self.results = self.getresults( def getresults(self: if 'Find' in self.storagecontents.keys(and 'Cpr' in self.storagecontents.keys(: self.cpr = self.storagecontents['cpr'].value self.results = sql.row('child',self.cpr else: self.results = None return self.displayresults(
Hvordan sker det? def init (self, tablename, key='': Persistent. init (self,tablename, None if key!= '': #insert the table row self.values = database.findrecords(tablename,[],{self.primarykey:key}
Hvordan sker det? def init (self, tablename, key='': Persistent. init (self,tablename, None if key!= '': #insert the table row self.values = database.findrecords(tablename,[],{self.primarykey:key}
Hvordan sker det? def displayresults(self: if self.results!= None: if self.results.empty == False: thetable = self.results.makehorizontaltable(
Hvordan sker det? def makehorizontaltable(self: return htmlroutines.makehorizontaltable(self.combinecolumnnamesandvalues(
Hvordan sker det? def makehorizontaltable(tablecontents: htmltabel = '<table width="75%" border="1">\n' entries = tablecontents[0] for row in range(len(entries: htmltabel += makehorizontalrow(row,tablecontents htmltabel += '</table>\n' return htmltabel
Hvordan sker det?
Hvordan sker det? def makedynamicpage(self: #make the header thepage = '''Content-type: text/html ''' #make the whole page consisting of beginning, results and ending thepage += self.beginning + self.getresults(+ self.ending return thepage
Summarummarum: Webpages!"
Klassen Webpage class WebPage: '''This class is an abstract class and not intended for generating instances. However, it can be used as a dummy that is later replaced by its subclasses'' def init (self, beginning, ending, message,title: # #message and #title is placeholders in the html-string #they are replaced by the contents of the variables message and title self.beginning = beginning.replace('#message',message,1 self.beginning = self.beginning.replace('#title',title,1 self.ending = ending self.message = message Her fisker vi FieldStorage ud af cgi self.storagecontents = cgi.fieldstorage( modulet def getstoragecontents(self: #gets the information sent from a form return self.storagecontents def getresults(self: #default function. Returns a table of the information sent from a form #Its subclasses make database access and return the results #in tabular form return self.displayresults(self.storagecontents
Klassen Webpage def displayresults(self,astorage: '''Input: a fieldstorage object Returns a horizontal table with key/value pairs from a fieldstorage''' atable = '<table width="619" border="1">' for k in astorage.keys(: atable += ''' <tr> <td > %s</td> <td > %s</td> </tr>''' %(k, astorage[k].value atable += '\n</table>' return atable def makedynamicpage(self: #make the header thepage = '''Content-type: text/html ''' #make the whole page consisting of beginning, results and ending thepage += self.beginning + self.getresults(+ self.ending return thepage %: kan bruges til at parametrisere en streng, men pas på: HTML bruger % til andre ting!
Brug af Webpage if name == " main ": message = '''Udmeld eller ret dette barn. Denne side er ikke faerdig, men viser blot hvordan fieldstorage ser ud. ''' title = 'Udmeld/Ret' test = WebPage(beginning,ending,message,title print test.makedynamicpage( Webpage er en default klasse der blot laver en webpage med det rå indhold af fieldstorage. Kan bruges under udvikling af systemet til at teste hvad der egentlig er sendt til serveren fra klienten.
Eksempel
SQL (før: OOogSQL
HTMLroutines def makeverticaltable(tablecontents: ''' Produces a html table. Input is a list of list [a1,a2,a3...] where ai is a list. Each ai is visualised as a row in the html-table. ''' def makeverticalrow(rowcontents: '''produces a row by calling makeverticalcell''' def makeverticalcell(cellcontents: ''' produces a cell in the table''' def makehorizontaltable(tablecontents: ''' Produces a html table. def makehorizontalrow(row,tablecontents: '''produces a row by calling makehorizontalcell''' def makehorizontalcell(row,cell,tablecontents: ''' produces a cell in the table'''
OBS Jeg opdagede at et par funktionskald er overflødige Vent med at bruge modulerne til jeg har rettet det.
Tilstandsdiagrammer Web-siderne er tilstande Links er overgang fra en tilstand til en anden Opdel beskrivelsen hvis der er mange links
De resterende links
Opgave 10..\øvelser\øvelser10.doc