Dagens föreläsning Scriptprogrammering Sommaren 2007 Webbuppgift HTTP och hur kontakten sker mellan klient och server. Apache-servern HTML. Exekvera Pythonscript. Formulär. Model-View-Controller på webben. CSS. Presentation av uppgiften. ORM och Zope. Django. IT Uppsala universitet 2007-06-26 2 Lagerdesign för webbkommunikation Ställa in Apache för Python Tre lager (förenklat). Klient och server kommunicerar via protokollet HTTP, HyperText Transfer Protocol. HTTP är tillståndslöst, varje förfrågan behandlas separat. Klient Server Databas Då WAMP installeras väljs en mapp som är rotkatalog för servern. Standardinställningen är {sökväg till WAMP\www till exempel c:\program\wamp\www. För att testa servern anges adressen http://localhost i en webbläsare. 2007-06-26 3 2007-06-26 4 Skapa en statisk sida. HTML-koden sparas som test01.html i mappen www\python. Adressen blir därmed http://localhost/python/test01.html. Skapa ett Pythonscript Pythonkoden sparas som script01.py i mappen www\python. Adress: http://localhost/python/script01.py.!c:/program/python25/python.exe <head> <title>hello web world!</title> </head> Detta är ett första HTML-test. <head> <title>hello dynamic world!</title> </head> Klockan är. """ 2007-06-26 5 2007-06-26 6 1
Exekvera Pythonscript Om vi inte talar om för Apache att Pythonscript ska exekveras kommer de att visas som vanliga textfiler. Steg 1: Lägg till exekvering av script för rotkatalogen. Steg 2: Tala om att py-filer är exekverbara script. <Directory "C:/Program/wamp/www"> Possible values for the Options directive are "None", "All", or any combination of: Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews Note that "MultiViews" must be named *explicitly* --- "Options All" doesn't give it to you. The Options directive is both complicated and important. Please see http://httpd.apache.org/docs/2.2/mod/core.htmloptions for more information. Options Indexes FollowSymLinks ExecCGI AllowOverride controls what directives may be placed in.htaccess files. It can be "All", "None", or any combination of the keywords: Options FileInfo AuthConfig Limit AllowOverride all Controls who can get stuff from this server. onlineoffline tag - don't remove Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory> 2007-06-26 7 2007-06-26 8 Steg 2: Lägg till py-filer AddHandler allows you to map certain file extensions to "handlers": actions unrelated to filetype. These can be either built into the server or added with the Action directive (see below) To use CGI scripts outside of ScriptAliased directories: (You will also need to add "ExecCGI" to the "Options" directive.) AddHandler cgi-script.cgi.py Därmed är Apache konfigurerat. Det finns andra (bättre) sätt att exekvera Pythonscript i Apache men detta är det enklaste. Felmeddelanden Studera följande kod som innehåller ett fel:!d:/program/python25/python.exe print "<p>hej</p>" pri print "Hej igen" Då detta exekveras visas allt som genererats fram till felet. Ingen information om felet visas. 2007-06-26 9 2007-06-26 10 Skriv ut information Lägg till raden.!d:/program/python25/python.exe print "<p>hej</p>" pri print "Hej igen" Uppmärkningsspråk. Uppmärkningsspråk används för att märka innehållet i en textfil. Märkningen är abstrakt. Man talar om att en text är en rubrik, inte hur rubriken ska se ut. SGML, Standard Generalized Markup Language, är ett metaspråk för uppmärkning. Används inte lika mycket som sina derivat. XML, extensible Markup Language, är en förenklad variant av SGML som förenklar arbetet att implementera en parser. XML används som bas för många olika standardformat såsom XHTML, SVG, RSS och SOAP. HTML, HyperText Markup Language, baserades från början på SGML men implementerar inte dess strikta krav på uppmärkningen. 2007-06-26 11 2007-06-26 12 2
Introduktion till HTML Som vi redan sett består HTML av ett antal "taggar" som beskriver vad texten inuti taggarna är för typ av text. Taggar skrivs <tagnamn> </tagnamn> eller <tagnamn/>. Varje HTML-dokument bör börja med en <html/>tag. Därefter följer en <head/>-tag som innehåller metainformation om dokumentet. Sist kommer <body/>-taggen som innehåller själva innehållet. HTML skiljer inte på stora och små bokstäver men w3 rekommenderar användandet av små bokstäver. å ä ö Å Ä Ö Svenska tecken å ä ö Å Ä Ö 2007-06-26 13 2007-06-26 14 <head></head> <h1></h1> <p></p> <b> <i></i> <a></a> <table></table> <tr></tr> <td></td> <form></form> <img/> Vanliga HTML-taggar HTML-dokument. Metainformation om dokumentet. Innehållet i dokumentet. Rubrik nivå 1, 2 o.s.v. Paragraf. Fet stil. Kursiv stil. Hyperlänk. Tabell. Rad i tabell. Kolumn i tabell. Formulär. Bild. Attribut för taggar Taggar kan ha attribut som anges med namn och värde.!d:/program/python25/python.exe <p title="denna text visas inte direkt."> Sätt muspekaren på texten. </p> """ 2007-06-26 15 2007-06-26 16 Bilder Länkar!d:/program/python25/python.exe Ett litet bi:<br/> <img src="images/honeybee.jpg" """!d:/program/python25/python.exe <a href="http://www.google.se">hitta en sak.</a> """ 2007-06-26 17 2007-06-26 18 3
Formulär Formulär används för att skicka information från klienten till servern. Eftersom HTTP är tillståndslöst måste kommunikationen ske i flera steg. Steg 1: Servern skickar ett formulär till klienten. Steg 2: Användaren fyller i formuläret och klickar på "Skicka in"-knappen. Steg 3: Servern tar emot informationen från formuläret och utför något beroende på innehållet. Steg 4: Oftast skickar servern tillbaka någon form av information som meddelar vad som hänt med informationen. Exempel med formulär Ett formulär innesluts av <form/>-taggen och kan innehålla valfritt antal <input/>-taggar. action-attributet anger vilket script som ska hantera formuläret. method-attributet styr hur informationen skickas till det mottagande scriptet. Varje <input/>-tag har en typ och ett namn. <h1>litet formulärexempel</h1> <p>fyll i vad du heter och vilket år du är född:</p> <form action="handleform01.py" method="get"> <input type="text" name="fullname" /><br/><br/> <input type="text" name="year" /><br/><br/> <input type="submit" value="behandla formulär" /> </form> 2007-06-26 19 2007-06-26 20 Formuläret i webbläsaren <h1>litet formulärexempel</h1> <p>fyll i vad du heter och vilket år du är född:</p> <form action="handleform01.py" method="get"> <input type="text" name="fullname" /><br/><br/> <input type="text" name="year" /><br/><br/> <input type="submit" value="behandla formulär" /> </form> Hanteraren!d:/program/python25/python.exe import datetime import cgi form = cgi.fieldstorage() if form.has_key("fullname") and \ form.has_key("year"): body = """Hejsan %s. Du är %s år gammal.""" % \ (form["fullname"].value, datetime.date.today().year - int(form["year"].value)) else: body = """Felaktigt formulärdata.""" <head> <title>hello dynamic world!</title> </head> %s """ % body 2007-06-26 21 2007-06-26 22 Särskilda tecken Andra uppmärkningsspråk Vissa tecken har särskilda betydelser i HTML och måste därför skrivas som "escapekoder". >>> import cgi >>> cgi.escape("<>åäöåäö%&?") '<>\x86\x84\x94\x8f\x8e\x99%&?' HTML:s "luddighet" gör det olämpligt som format för datalagring. Försök har gjorts och görs för att strama upp HTML, exempelvis XHTML-validering. Det är bättre att spara data i ett rigoröst definierat format, exempelvis XML, och sedan omvandla det till HTML när det ska skickas till en klient. 2007-06-26 23 2007-06-26 24 4
Layout för strukturerade dokument HTML har taggar som styr innehållets utseende, exempelvis <b/> och <i/>. Typsnitt kan detaljstyras med <font/> och tabeller kan ges en specifik layout genom attributinställningar. Genom att blanda layout och innehåll bryter vi mot designmodellen Model-View-Controller (MVC). En bättre lösning är att ange layout separerat från HTML-dokumentet. CSS Cascading Style Sheets är ett sätt att definiera en design separat från ett HTMLdokument. Används ofta i kombination 2007-06-26 25 2007-06-26 26 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <head> <title>racing with rails</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <style type="text/css"> <!-- @import url(styles.css); --> </style> </head> <!-- BaseWrapper --> <div id="basewrapper"> <!-- Header --> <div id="header"> <h1>racing with rails</h1> <!-- /Header --> HTML-koden <!-- ContentWrapper --> <div id="contentwrapper"> <!-- MainContent --> <div id="maincontent"> <h1>den fina hemsidan</h1> <p>text om vad som helst</p> <!-- /MainContent --> <!-- Menu --> <div id="menu"> <ul id="menulist"> <li><a href="">hem</a></li> <li><a href="">sida</a></li> </ul> <!-- /Menu --> <!-- /ContentWrapper --> <!-- /BaseWrapper --> /*--------------------------------------Basic style sheet --------------------------------------*/ /* GENERAL --------------------------------------*/ * { padding: 0; margin: 0; /* POSITIONING --------------------------------------*/ body { padding: 10px; margin: 0; divbasewrapper { width: 500px; divheader { width: 500px; height: 70px; padding: 20px 0 0 20px; margin: 0; divmaincontent { width: 360px; float: right; padding: 10px 0 0 0; divmenu { width: 110px; float: left; padding: 10px 0 0 20px; CSS-koden /* TYPOGRAPHY ----------------------------------*/ body { font-size: 75%; font-family: Verdana, Arial, Helvetica, sans-serif; divheader h1 { font-size: 3.5em; font-family: "Times New Roman", Times, serif; divmaincontent p { divmaincontent h1 { font-size: 1.7em; /* COLOR ----------------------------------*/ body { background-color: ffffff; color: 666666; divheader { background-color: eeeeee; border-bottom: 3px solid 90b11f; divmaincontent h1 { color: FF3300; 2007-06-26 27 2007-06-26 28 Utan CSS Med CSS 2007-06-26 29 2007-06-26 30 5
Inlämningsuppgiften Uppgiften består i att skapa ett bokningssystem för en tandläkarmottagning. Utförs i grupper om två personer. Inlämningsuppgiften lämnas in skriftligt enligt instruktionerna på nätet. En muntlig tentamen kommer att äga rum under vecka 34. Förutsättningar Mottagningen har öppet kl 8-17 måndag till fredag, förutom kl 12-13 då den är lunchstängd. Varje behandling startar på hel timma och pågår 60 minuter. Det räcker om prototypen kan hantera en enda vecka. Det ska finnas en startsida där patienterna hittar länkar till sidor för olika ändamål. När en patient ska boka en tid bör det finnas en veckoöversikt, där det framgår vilka tider som är lediga. En patient bör kunna få upp en förteckning över sina bokade tider, där det är möjligt att avboka besök vid behov. Tandläkaren ska ha en egen vy av veckoöversikten, där hon kan se alla bokade tider och där patientens namn och typen av behandling (undersökning, lagning, rotfyllning med mera) framgår. Normalt skulle sådan funktionalitet hanteras av ett separat lösenordsskyddat program, men för att förenkla prototypen ska även denna veckoöversikt vara tillgänglig för alla via webben. I övrigt är uppgiften relativt fri. Tveka inte att experimentera. Det viktiga är att öva programmering, inte få till en optimal bokningstjänst. 2007-06-26 31 2007-06-26 32 Nivå 2 Ska utföras individuellt av de som inte kan närvara vid den muntliga tentamen. Den som lämnar in nivå 2 ska även göra nivå 1 individuellt eftersom det är betygsgrundande. Betygsättning Inlämningsuppgifter och den muntliga tentamen betygssätts på skalan Underkänd, Godkänd och Väl godkänd. Varje inlämningsuppgift (två av webb, beräkning och bio) betygssätts separat. Tentamen utgör 40% och inlämningsuppgiften 60% av slutbetyget. Minst godkänt krävs på alla ingående delar. Totalt kommer alltså fyra betyg ges till dem som gör nivå 1 och två till dem som gör nivå 2. 2007-06-26 33 2007-06-26 34 Val av språk Efter moget övervägande har jag kommit fram till att inlämningsuppgiften nivå 1, får skrivas i Python, PHP, Perl eller Ruby. Nivå 2 får skrivas i Django, Zope, Ruby on Rails eller motsvarande ramverk i något av ovanstående språk. Inga "färdiga" bokningssystem får användas. Tyvärr kan jag endast erbjuda begränsad handledning i Perl. Övriga språk likvärdiga. Val av lagringsmodell Valet är fritt: Relationsdatabas (MySQL, SQLite). Textfil. Binär fil. pickle/shelve ORM. 2007-06-26 35 2007-06-26 36 6
Objektsdatabaser Relationsdatabaser är bra för stora mängder homogen data. Mindre bra för komplexa, heterogena datamängder. För dessa fall kan objektsdatabaser (ODBMS/OODBMS) vara en bra lösning. Objektsdatabaser Fördelar: Enkelt att spara objekt från exempelvis Python. Inga extra steg krävs för att spara dtaa från objektorienterade applikationer. Nackdelar: Få standarder. Få verktyg. Inbyggd motsättning mellan OOP:s inkapsling av data och databasers datacentrerade perspektiv. Sämre prestanda än relationsdatabaser. 2007-06-26 37 2007-06-26 38 Mappning En hybridlösning är att skapa en mappning mellan objekt i en applikation och tabeller i en relationsdatabas. Klasser motsvaras av tabeller och attribut av kolumner. Denna process kan enkelt automatiseras. Detta har gjorts med stor framgång i exempelvis Zope Object Database och Active Records i Ruby on Rails. Object publishing Alternativt sätt att hantera server-side scripting. CGI-programmering tenderar att resultera i stort fokus på generering av rätt text att skicka tillbaka till klienten. Object publishing innebär att steget från webbadresser till funktions- och metodanrop automatiseras. 2007-06-26 39 2007-06-26 40 Zope Zope är ett web publishing framework. Zope är skrivet i Python. Består av flera komponenter. De viktigaste är: Zope Object Request Broker (Zope ORB) HTML mallar. Separerar logik och layout. Object database. Bygger på samma teknik som shelve, men stöder även bland annat transaktioner och samtidig dataaccess. Zope ORB Agerar mellanhand mellan CGI-världen och Python objektvärld. Vanlig CGI-applikation: URL request Klient Server Zope ORB HTML response Zope: Vanliga URL request anrop Klient Server Zope ORB Pythonkod HTML response 2007-06-26 41 2007-06-26 42 7
Zope ORB översätter URL:er En URL (Uniform Resource Locator) anger hur ett objekt eller en tjänst lokaliseras på Internet. Zope ORB översätter en URL till metodanrop för objekt: http://server/path/mod/obj1/obj2/met_name?arg1=val1&arg2=val2 Detta översätts av ZORB:en på server till ett Pythonanrop för ett objekt i sökvägen path: mod.obj1.obj2.met_name(arg1=val1,arg2=val2) Zope ORB fortsättning Svaret som skapas av Pythonkoden omformateras av Zope (mha HTML-mallar) till HTML och skickas tillbaka till klienten. Klienten märker ingen skillnad. HTML-kod från statiskt innehåll och dynamiskt innehåll, oavsett om det genereras av Pythonscript via CGI direkt eller via Zope, ser likadant ut då det når klienten. 2007-06-26 43 2007-06-26 44 Django och Rails Webbramverk som levereras med en egen webbserver för snabb och enkel utveckling. Kräver få andra programvaror vilket gör det lättinstallerat. http://www.djangoproject.com http://www.rubyonrails.org 2007-06-26 45 2007-06-26 46 2007-06-26 47 8