Dynamické stránky v praxi Bedřich Košata
Reálné scénáře Statické stránky + dynamický search Všechno dynamické spousta práce a opakujících se úkolů SQL není příliš přenosné mezi databázovými systémy => nelze za chodu vyměnit např. MySQL za PostgreSQL => je praktické mít nějakou vrstvu mezi databází a generovaným HTML
Model jednoduché stránky Skript si pomocí SQL vytáhne data z databáze a vytvoří HTML stránku SQL se často opakuje a je nepřenosné Databáze SKRIPT HTML stránka
Model databázová mezivrstva Jednotlivé databázové objekty se modelují pomocí tříd Objektová mezivrstva se stará o generování SQL => při výměně databáze stačí upravit mezivrstvu Reálné objektové modely již různé databáze podporují Databáze Objektový datový model SKRIPT HTML stránka
Jak vypadá objektový model Django class Article( models.model): title = HTMLTextField ("Title of the article") page = models.positiveintegerfield ("Starting page") last_page = models.positiveintegerfield("last page", null=true, blank=true) authors = models.manytomanyfield( 'Author', through='article2author') doi = models.charfield (max_length=30) volume = models.positivesmallintegerfield() issue = models.positivesmallintegerfield() year = models.positivesmallintegerfield() abstract = HTMLTextField( "Abstract", null=true, blank=true) release_date = models.datetimefield( null=true) keywords = models.manytomanyfield( 'Keyword', through='article2keyword')
class Volume( models.model): number = models.positivesmallintegerfield( primary_key=true) year = models.positivesmallintegerfield(null=true) class Issue( models.model): id = models.positiveintegerfield( primary_key=true) volume = models.foreignkey (Volume) number = models.positivesmallintegerfield() class Author( models.model): given_name = HTMLCharField (max_length=50,null=true) surname = HTMLCharField (max_length=50) class Article( models.model): title = HTMLTextField ("Title of the article") page = models.positiveintegerfield ("Starting page") last_page = models.positiveintegerfield("last page", null=true, blank=true) authors = models.manytomanyfield( 'Author', through='article2author') doi = models.charfield (max_length=30) volume = models.positivesmallintegerfield() issue = models.positivesmallintegerfield() year = models.positivesmallintegerfield() abstract = HTMLTextField( "Abstract", null=true, blank=true) release_date = models.datetimefield( null=true) keywords = models.manytomanyfield( 'Keyword', through='article2keyword')
Model template engines Skript generuje stránku na základě dat => není oddělená logika od prezentace dat Návrh a úpravy vzhledu stránek musí dělat programátor Databáze Objektový datový model SKRIPT HTML stránka
Model template engines Template engine (šablonový stroj :) odděluje prezentaci dat od logiky Lze oddělit roli programátora a designéra. data Databáze Objektový datový model SKRIPT šablona HTML HTML stránka
Jak vypadá šablona Cheetah <HTML> <HEAD><TITLE>$title</TITLE></HEAD> <BODY> <TABLE> #for $client in $clients <TR> <TD>$client.surname, $client.firstname</td> <TD><A HREF="mailto:$client.email">$client.email</A></TD> </TR> #end for </TABLE> </BODY> </HTML>
Jak vypadá šablona Jinja nebo Django <HTML> <HEAD><TITLE>{{ title }}</TITLE></HEAD> <BODY> <TABLE> {% for client in clients %} <TR> <TD>{{ client.surname }}, {{ client.firstname }}</TD> <TD><A HREF="mailto:{{ client.email }}">{{ client.email }}</A></TD> </TR> {% endfor %} </TABLE> </BODY> </HTML>
Jak vypadá šablona Jinja inheritance <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> {% block head %} <link rel="stylesheet" href="style.css" /> <title>{% block title %}{% endblock %} - My Webpage</title> {% endblock %} </head> <body> <div id="content">{% block content %}{% endblock %}</div> <div id="footer"> {% block footer %} Copyright 2008 by <a href="http://domain.invalid/">you</a>. {% endblock %} </div> </body> </html>
Jak vypadá šablona Jinja inheritance {% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ super() }} <style type="text/css">.important { color: #336699; } </style> {% endblock %} {% block content %} <h1>index</h1> <p class="important"> Welcome on my awsome homepage. </p> {% endblock %}