cgi og dynamiske web-sider
DESCRIPTION
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. CGI. Common Gateway Interface Måde at afvikle programmer på serveren , hvor resultatet sendes tilbage til klienten ( browseren ) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/1.jpg)
CGI og dynamiske web-sider
Uge 47W. J. Chun: Core Python programming, kap 19.4 - 19.5. Kompendium.
![Page 2: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/2.jpg)
I mål - næsten!
Database – Python - Webklient
Database
klient
Databasekommando svar
Web-side
Forespørgsel/Nye data
Python program
![Page 3: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/3.jpg)
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 (kigger vi på senere hvis I selv vil)
Alle programmeringssprog kan benyttes Mest kendt: Perl, Python
![Page 4: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/4.jpg)
Vi sender data afsted
![Page 5: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/5.jpg)
Data kan sendes på 2 måder: POST eller GET
Ved GET bliver vores forespørgsel omkodet til en del af url’en. Den er altså synlig for andre:
http://www.google.dk/search?q=filezilla&sourceid=navclient-ff&ie=UTF-8&rlz=1B3GGGL_daDK217DK217
Ved POST bliver dataen sendt afsted i en ”message body” og vil ikke være synlig for andre
Grundet dette er det meningen at vi kun bruger GET når vi bare skal modtage data fra serveren og f.eks. gerne ville kunne give dette link videre til andre. F.eks. I google søgningen, billedgallerier osv.
Vi bruger derimod POST til alt hvor vi skal overføre information til serveren såsom ordre, ændringer af adresser og andre private ting.
Key Value
SplitterStart på GET strengen
![Page 6: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/6.jpg)
DataflowClient
Database
cgi.FieldStorage
Jeres program, lav
web-side
Sql-command
Tuple of tuples
Html code
Layout information
Server proces
Name = value
Jeres program, Cgi
modulet
Name = value
Jeres program,
håndter sql-command
Adresse på pythonprogram
![Page 7: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/7.jpg)
Forms <form id="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
![Page 8: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/8.jpg)
Test af cgi
![Page 9: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/9.jpg)
Illustrerer
http://pbvahlst.web.student.hum.au.dk/ITOE07/test/index.html
Felter, menuer, radioknapper, checkboxe
(Note to self: husk nu at tænde det trådløse netkort og log ind!!!)
![Page 10: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/10.jpg)
HTML-koden <form action="testresults.py" method="post" id="form1"> <fieldset> <legend>Test</legend> <p> <label for="name">Name</label> <input type="text" name="name" id="name" /> <label for="address">Address</label> <input type="text" name="address" id="address" /> </p> <p> <label for="colorchoice">Choose color</label> <select name="colorchoice" id="colorchoice"> <option value="green">green</option> <option value="blue">blue</option> <option value="red">red</option> </select> <label for="happy">Are you happy</label> <input type="checkbox" name="happy" id="happy" value="true" /> </p>
Text felt
Menu
Checkbox
Starten på ’form’
Hvor skal dataen sendes til? Skal den sendes som en del af URL’en eller som en ”message body?”
xhtml til screen reader
Den value der bliver overført hvis den er valgtHvis intet er valgt bliver der ikke overført noget
![Page 11: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/11.jpg)
HTML-koden
<p> <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> <label for="task">What do you want to do?</label> <select name="task" id="task"> <option value="eat">eat dinner</option> <option value="sleep">go to sleep</option> <option value="work">go to work</option> </select> <br /> </fieldset> <p> <input type="submit" name="PostIt" id="PostIt" value="Post http request" /> </p> </form>
Radioknap-per
Menu
Knap
Samme navn: kun en kan være valgt af gangen
![Page 12: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/12.jpg)
Test af cgi
![Page 13: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/13.jpg)
FieldStorage
aStorage = cgi.FieldStorage() Kan behandles som en slags
dictionary If ’address’ in aStorage.keys:
addressen = aStorage[’address’].value
Returnerer et object med variablen valuesom indeholder den værdi der passer til nøglen
![Page 14: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/14.jpg)
Brug af testresults.py
<form action = ”http://pbvahlst.web.student.hum.au.dk/ITOE07/test/testresults.py” method="post" id="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 det eksemplar der ligger på min serverplads
Start med at lade alle sider aktivere testresults.py Så kan I se præcis hvilke data der fremsendes.
![Page 15: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/15.jpg)
Gennemgang af eksempelsystemet
Et lille system til børnehaver hvor det er muligt at søge på børn og se alle børn i børnehaven
Systemet: http://pbvahlst.web.student.hum.au.dk/ITOE07/
![Page 16: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/16.jpg)
findResult.py <form id="form1" method="post" action="findResult.py"> <p>CPR <input type="text" name=“cpr“ /> </p> <p> <input type="submit" name=“search" value=“Søg“ /> </p> </form>
Data sendt: cpr = 1111111 & search = Søg
findResult.py #!/usr/bin/python from dynamicWebPages import * if __name__ == "__main__": title = 'Vis resultat' test = FindResult(beginning,ending,title) print test.makeDynamicPage()
Output af print går ikke ud på konsollen men opfattes som en beskrivelse af den html side der skal sendes tilbage
Laver et objekt af klassen FindResult og printer den som htmltabel
Placeringen af Python fortolkeren
Del af en statisk xhtml-side
Bliver kun kaldt hvis det er denne fil der eksekveres
![Page 17: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/17.jpg)
Resultat
![Page 18: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/18.jpg)
test = FindResult(beginning,ending,message,title)
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
![Page 19: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/19.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def __init__(self, beginning, ending, title): WebPage.__init__(self, beginning, ending,title)
![Page 20: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/20.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def __init__(self, beginning, ending, title): self.beginning = beginning.replace('#title',title,1) self.ending = ending self.message = message self.storageContents = cgi.FieldStorage()
![Page 21: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/21.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
Har ingen anelse om hvad der sker
![Page 22: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/22.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
![Page 23: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/23.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
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
![Page 24: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/24.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
class FindResult(ResultPage): def __init__(self, beginning, ending, message,title): ResultPage.__init__(self, beginning, ending, message,title) …
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 = Nonereturn self.displayResults()
![Page 25: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/25.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def __init__(self, tableName, key=''): Persistent.__init__(self,tableName, None) if key != '': #insert the table row self.values = database.findRecords(tableName,[],{self.primaryKey:key})
![Page 26: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/26.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def __init__(self, tableName, key=''): Persistent.__init__(self,tableName, None) if key != '': #insert the table row self.values = database.findRecords(tableName,[],{self.primaryKey:key})
![Page 27: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/27.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def displayResults(self): if self.results != None: if self.results.empty == False: theTable = self.results.makeHorizontalTable()
![Page 28: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/28.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def makeHorizontalTable(self): return htmlRoutines.makeHorizontalTable(self.combineColumnNamesAndValues())
![Page 29: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/29.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
def makeHorizontalTable(tablecontents):htmltabel = '<table>\n' entries = tablecontents[0] for row in range(len(entries)): htmltabel += makeHorizontalRow(row,tablecontents) htmltabel += '</table>\n' return htmltabel
![Page 30: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/30.jpg)
Hvordan sker det?
message = 'Foelgende barn blev fundet' title = 'Vis resultat' test = FindResult(beginning,ending,message,title) print test.makeDynamicPage()
findResult.py
dynamicWebPages.py
+__init__()+getResults()+displayResults()
-cpr-results
findResult
+__init__()+makeDynamicPage()
-storageContents-beginning-message-ending
WebPage
sql.py
+__init__()
FieldStorage
*
-storageContents
*
+__init__()-
Row
1
-results
1
+__init__()+makeVerticalTable()+makeHorizontalTable()
-columnnames-values
SQL
+__init__()
-primarykey-tablename
Persistentdatabase.pyfindRecords(table,fields,criteria)
cgi.py
htmlRoutines.pymakeHorizontalTable(tablecontents)
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
Saml og returner
Udskriv til webserveren
![Page 31: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/31.jpg)
Skal vi have det en gang til?
?
![Page 32: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/32.jpg)
Summarummarum: Webpages
+getStorageContents()+getResults()+displayResults()+makeDynamicPage()
-beginning-ending-message-storageContents
WebPage
+init()+getResults()+displayResults()
SearchResult
+init()
ResultPage
+init()+getResults()+displayResults()
FindResult
Søger efter cprFremviser resultatet i en horizontal tabel
Søger efter navn og adresseFremviser resultatet i en vertikal tabel
Overskriver overklassen funktioner
Overskriver overklassen funktioner
![Page 33: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/33.jpg)
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, title): # title is placeholders in the html-string #it isreplaced by the contents of the variable title self.beginning = beginning.replace('#title',title,1) self.ending = ending self.storageContents = cgi.FieldStorage()
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)
Her fisker vi FieldStorage ud af cgi modulet
Fisk det ønskede data frem f.eks. fra databasen
Formater det hentede data til xhtml
![Page 34: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/34.jpg)
Klassen Webpage def displayResults(self,aStorage): '''Input: a fieldStorage object Returns a horizontal table with key/value pairs from a fieldstorage''' atable = '<table> 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!
tuple
![Page 35: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/35.jpg)
Brug af Webpage
if __name__ == "__main__": title = 'Udmeld/Ret' test = WebPage(beginning,ending,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.
![Page 36: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/36.jpg)
Eksempel
Hvis vi kalde vores test af webPage med formen fra tidligere ville det se sådan ud
![Page 37: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/37.jpg)
SQL (hed før: OOogSQL)
+init()+makeHTMLTable()+printContents()+combineColumNamesAndValues()+makeVerticalTable()+makeHorizontalTable()
-columnNames-values
SQL
+init()+getPrimaryKey()+printContents()
-primaryKey-tableName-columnNames
Persistent
+init()+getRow()+printContents()
-rows
Table+init()+put()+putAll Values()+get()+update()+insert()+delete()
Row
+init()
Temporary
1 *
nyt
![Page 38: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/38.jpg)
HTMLroutines (nyt modul som SQL benytter sig af) def makeVerticalTable(tablecontents, header=True): ''' 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, header=False): '''produces a row by calling makeVerticalCell'''
def makeVerticalCell(cellcontents): ''' produces a cell in the table'''
def makeHorizontalTable(tablecontents, header=True): ''' Produces a html table.
def makeHorizontalRow(row,tablecontents, header=False): '''produces a row by calling makeHorizontalCell'''
def makeHorizontalCell(row,cell,tablecontents): ''' produces a cell in the table''’ Kan også bruges uden SQL modulet hvis man har noget på
listeform man gerne vil have lavet om til en xhtml-tabel
![Page 39: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/39.jpg)
Husk!
Brug det nye databasemodul. Modulet i lavede i sidste uge er her
med som modulet SQL, med lidt flere metoder
Husk at uploade som text-filer og sætte permissions på serveren, gøres igennem fileZilla eller lignende ftp-program
![Page 40: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/40.jpg)
Opsætning af apache2 webserver
http://apache.org/dist/httpd/binaries/win32/filen hedder ”apache 2.2.6-win32-x86-no ssl.msi” til pc
Gør det nemmere og hurtigere at teste sine scripts, da de ikke skal uploades til serveren hver gang, og der skal heller ikke sættes permissions
På hjemmesiden ligger der en config fil, hvis i søger på ”PBV_CHANGE” kan i se de steder der skal ændres for at det virker. Den fil i skal ændre ligger i installationsdiret under ”conf” og hedder ”httpd.conf”
Husk at ændre den øverste linje i jeres scripts så de peger på det sted hvor python fortolkeren ligger på jeres egen maskine f.eks. ”#!C:/python25/python.exe” husk også at ændre det tilbage inden i ligger det på serveren til ”#!usr/bin/python” og så sætte permissions
![Page 41: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/41.jpg)
Hvordan virker det?
Når alt er sat op korrekt skulle det gerne virke således at hvis I skriver http://localhost i en browser får i den evt. index.html eller index.py side i skulle have liggende i jeres root-dir. Så altså hvis i har en mappestruktur der hedder minOpgave/eksamen/ med filen test.py tilgår i den via browseren ved http://localhost/minOpgave/eksamen/test.py
Refererer til root dir. F.eks. D:\HTTPI stedet for www
![Page 42: CGI og dynamiske web-sider](https://reader035.vdocuments.site/reader035/viewer/2022062316/5681672e550346895ddbd206/html5/thumbnails/42.jpg)
Opgave 10
Opgave 10 og de tilhørende filer ligger på hjemmesiden