python_vs_php.pdf

(711 KB) Pobierz
732489819 UNPDF
Technikę
Python kontra PHP
czyli węże i słonie
Trend web 2.0 przyniósł ze sobą nie tylko nowe podejście do tworzenia
stron internetowych, ale również nowe technologie i narzędzia. Wielu z nas
słyszało lub miało kontakt z Ruby on Rails, a użytkownicy portalu grono.net
korzystali z aplikacji napisanej w Django.
Dowiesz się...
• Zapoznasz się z nowymi narzędziami do two-
rzenia stron www.
Powinieneś wiedzieć...
• Podstawowa znajomość PHP i wzorca MVC.
wiązań, które zostały wykorzystane w wie-
lu projektach.
Niestety na większości kont hostingowych
wciąż dominuje PHP4. Wydanie PHP6 jesz-
cze bardziej spotęguje to zjawisko, a progra-
miści oprócz wykonania swojej pracy będą
musieli co chwilę uwzględniać wersję PHP,
pod którą ma działać ich aplikacja.
• Działają na wielu platformach i architek-
turach.
Poziom trudności
czać inne języki oferując kon-
kurencyjne rozwiązania, które
to omówimy w tym artykule. Cytując wiki-
pedię Python jest interpretowanym, interak-
tywnym językiem programowania stworzo-
nym przez Guido van Rossuma w 1990 ro-
ku. Rozwijany jest jako projekt Open Source ,
zarządzany przez niedochodową Python So-
ftware Foundation . PHP to wykonywany po
stronie serwera skryptowy język programo-
wania służący do generowania stron inter-
netowych. Python tak samo jak Ruby sam
z siebie nie jest przystosowany do tworzenia
stron www, jako że jest to język uniwersal-
ny od początku swojego istnienia. PHP nato-
miast od początku tworzony był jako język
do tworzenia stron www. W niniejszym ar-
tykule skupimy się nie tyle na porównaniu
języków, ale frameworków napisanych w Py-
thonie i PHP.
Mimo podobieństw są to dwa różne języki.
Zbiór różnic przedstawia Tabela 1.
Nie ulega wątpliwości, że PHP jest popular-
ny i ma bardzo dużą społeczność, również w
Polsce. Znalezienie pomocy, czy to w postaci
opublikowanych materiałów, czy też w posta-
ci forum dyskusyjnego to nie problem. Rów-
nież praktycznie każdy darmowy, tani ho-
sting będzie zawierał w ofercie obsługę skryp-
tów PHP.
Python ma mniejszą społeczność, w Pol-
sce jest raczej mało popularny, lecz w skali
światowej społeczność jest dość duża i sku-
piona wokół mniejszej ilości serwisów i orga-
nizacji. W kwestii hostingu umożliwiające-
go obsługę aplikacji Zope , Django czy Pylons
nie będziemy mieć licznego grona kandyda-
tów, lecz jakość usług będzie wysoka (np.
WebFaction ). Skrypty PHP wystarczy umie-
ścić na serwerze, korzystając np. z klien-
ta FTP. W przypadku aplikacji wspomnia-
nych frameworków praktycznie nieodzow-
ny będzie dostęp do shella oraz odpowied-
nia konfiguracja serwera www. Framewor-
ki Pythonowe nie nadają się więc jako „Mo-
ja pierwsza strona”.
Kolejnym punktem, który warto poruszyć
to wsteczna zgodność Pythona. Aplikacja pi-
sana pod Pythonem 2.5 będzie w stanie dzia-
łać pod Pythonem 2.3. Potencjalne zmiany w
kodzie ograniczą się do zmian nazw modu-
łów czy sposobu ich użytkowania (chyba że
użyjemy „starszej” nazwy modułu). W przy-
padku PHP jest jeden problem. PHP5 udo-
stępniło programistom wiele dobrych roz-
Python dla programisty PHP
Programista PHP dość szybko może połapać
się w konkurencyjnym języku, choć będzie
musiał przyzwyczaić się do pewnych różnic.
Pierwszą jest brak średnika na końcu linii,
drugą grupowanie kodu za pomocą wcięć. Pę-
tla for w PHP wygląda znajomo:
<?PHP
for($i=1;$i <=5;$i++)
{
print $i.'<br />';
}
?>
W Pythonie wyglądać może tak:
for i in range(1,6):
print i
Nieco większą różnicą jest brak tablic zna-
nych z PHP, a obecność list, tupli i dzienni-
ków. Pierwsze dwa typy uznać można za tabli-
ce numeryczne, a dzienniki za tablice asocja-
cyjne. Oto przykład:
Różnice i podobieństwa
Oba języki mają wiele wspólnego, ponieważ są:
dziennik = {'klucz': 'wartosc'}
print dziennik['klucz']
lista = ['element1', 'element2']
print lista[1]
print lista[0]
tupla = ['element tupli1', 'element
tupli2']
• Interpretowalnymi językami wysokiego
poziomu z dynamicznym systemem ty-
pów;
• Rozwijane jako projekty OpenSource;
• Posiadają duże społeczności;
• Łatwe w nauce (w porównaniu do np. Javy);
• Łatwe do rozszerzenia poprzez C/C++;
for i in tupla:
print i
28
04/2007
W królestwo PHP zaczynają wkra-
732489819.033.png 732489819.034.png 732489819.035.png 732489819.036.png 732489819.001.png 732489819.002.png 732489819.003.png 732489819.004.png 732489819.005.png 732489819.006.png 732489819.007.png
Python kontra PHP
Nowością będzie przestrzeń nazw i importo-
wanie modułów. W przypadku PHP w skryp-
cie mamy dostęp do wszystkich funkcji i klas
danej instalacji PHP. W przypadku Pythona
by uzyskać dostęp np. do klas obsługujących
pliki ZIP musimy zaimportować odpowied-
ni moduł:
nia aplikacji – dla Apache mamy mod_python
i mod_fcgid , dla Lighttpd , Cherokee czy
Nginx możemy wykorzystać protokół FastC-
GI lub SCGI .
Za chwilę poznamy bliżej framework Django .
W jego przypadku dodanie keszowania dla całe-
go projektu, to dodanie jednego wiersza w usta-
wieniach, a do keszowania możemy użyć m.in.
memcache – wydajnego systemu bazującego na
pamięci RAM .
Stosując Pythona do tworzenia dynamicz-
nych stron www, na pewno nie stracimy na wy-
dajności gotowych aplikacji, a nawet dość często
nawet zyskamy.
go systemu szablonów. Krótkie porównanie
przedstawia Tabela 2.
Oba frameworki są bardzo dobrymi rozwią-
zaniami. Django jest frameworkiem najlepiej
pasującym do aplikacji typu CMS. Pylons ma
podejście „zrób to sam” i króluje w przypad-
kach, gdy wymagamy elastyczności i stawiamy
nietypowe wymagania.
Portale takie jak Grono.net i lawrence.com
wykonane są w Django – i są dużymi serwisa-
mi internetowymi. Poradnikzdrowie.pl to ser-
wis napisany w Pylons zintegrowany z RedDo-
tem (istniejącą wcześniej strukturą serwisów
właściciela). Serwisy te dobrze obrazują różni-
ce między Django a Pylons .
import zipile
z = zipile.ZipFile("plik.zip", "r")
for plik in z.namelist():
print 'Plik: ', plik,
bajty = z.read(plik)
print 'ma', len(bajty), 'bajtow'
Wydajność i skalowalność
Oba języki są interpretowane (do wykonania
skryptu używa się interpretera), lecz PHP nie
jest kompilowany do bajtkodu i zapisywany
do wielokrotnego użytku. Każde żądanie wy-
słane do serwera spowoduje zinterpretowanie
i wykonanie kodu w locie. W przypadku Py-
thona kompilacja do bajtkodu jest automa-
tyczna, natomiast użytkownicy PHP muszą
skorzystać z kompilatorów nie wchodzących
w skład domyślnej dystrybucji PHP, takich
jak Xcache , eaccelerator , APC czy produktów
firmy Zend . W bezpośrednim starciu bez za-
biegów optymalizacyjnych Python wygra,
lecz odpowiednio skonfigurowane PHP nie
będzie miało się czego wstydzić.
Python i niektóre jego frameworki mo-
gą działać wielowątkowo, co jest wydajniej-
sze od zwykłego trybu pracy PHP, jako że ta-
ki tryb pracy zużywa mniej zasobów. Rów-
nież w przypadku Django czy Pylons może-
my skorzystać z różnych sposobów hostowa-
Frameworki Pythona
W Pythonie znajdziemy kilka (a nie kil-
kadziesiąt i więcej) frameworków do two-
rzenia stron www, które można wykorzy-
stać. Prym wiedzie Django i Pylons , a trze-
ci – TurboGears znajduje się obecnie w fa-
zie przejściowej między starą i stabilną se-
rią 1.X a przygotowywaną serią 2.X zgodną
z WSGI. Dobrze znane od dawna Zope i Plo-
ne też ewoluują, lecz to Pylons i Django pod
sztandarem nowoczesności i web 2.0 ataku-
ją układ LAMP .
Django to framework dla „profesjonalistów z
terminami”, jak głosi jego motto. Jest to dobrze
zintegrowany zestaw własnych komponentów
takich jak ORM wysokiego poziomu, system
szablonów czy mapper adresów URL. Pylons
to framework bazujący na integracji „najlep-
szych ze swojego rodzaju” rozwiązań.
Wykorzystuje on istniejące podzespoły jak
również umożliwia łatwą ich wymianę, tak
więc nie jesteśmy ograniczani do np. jedne-
WSGI
WSGI czyli Web Server Gateway Interface to
standard interfejsu aplikacji napisanej w Py-
thonie do porozumiewania się z serwerami.
Stworzono standard interfejsu, który obec-
nie stosowany jest przez wiele pythonowych
aplikacji, głównie frameworków i aplikacji
sieciowych.
Przestrzeganie standardu ułatwiło współ-
pracę wielu aplikacji ze sobą i z serwera-
mi – pojawiło się pojęcie middleware , czyli
skryptu o określonym interfejsie, modyfiku-
jącym żądanie bądź odpowiedź wysyłaną do
lub z serwera.
Dany skrypt middleware może być bez mo-
dyfikacji stosowany w każdym frameworku,
zgodnym z wytycznymi WSGI, co stanowi
ogromne pole do rozbudowy narzędzi tego
typu o nowe możliwości. Przykładem jest tu
framework Pylons stawiający na WSGI . Sam
nie posiada ani systemu użytkowników, ani
Tabela 1. Różnice pomiędzy językami PHP i Python
PHP
Python
Składnia bazująca na C i Perlu
Wcięcia stosowane do grupowania kodu
Instrukcje swith i do... while
Przestrzenie nazw
Brak przestrzeni nazw
Wszystko jest referencją
Nawiasy klamrowe stosowane do grupowania kodu
Wielowątkowość
Większa społeczność i popularność
Dużo typów wysokiego poziomu
Język głównie do tworzenia dynamicznych stron
Język ogólnego użytku
Stabilny, lecz gwałtowniej rozwijany (PHP4 – PHP5) Wstecznie zgodny, stabilny i dojrzały. Standaryzacja rozwiązań
Kompilatory dostępne jako rozszerzenia (APC, Xcache, eaccelerator, zend) Automatyczne kompilowanie do bajtkodu
Tabela 2. Porównanie frameworków Pythona
Django
Pylons
Dobrze zintegrowane własne komponenty
Integruje najlepsze istniejące komponenty i umożliwia ich łatwą wymianę
Łatwy w nauce, świetnie udokumentowany
Niespójna i mniej liczna dokumentacja (każdy komponent ma dokumenta-
cję na swojej stronie). Wymaga więcej czasu na naukę i konfigurację kom-
ponentów
ORM wysokiego poziomu obsługujący MySQL,
SQLite i PostgreSQL (Oracle od wersji 1.0)
Zalecane stosowanie ORMa SQLAlchemy – większe możliwości i łatwiejsza
praca na istniejących tabelach, lecz trudniejszy w nauce.
Większa społeczność, zastosowany w wielu projektach
Aplikacja może działać wielowątkowo
Generyczne widoki, Automatyczny panel admina, system użytkowników i
uprawnień
Wiele pomocników JavaSript, Ajax (w tym Scriptaculous)
www.phpsolmag.org
29
732489819.008.png 732489819.009.png 732489819.010.png 732489819.011.png 732489819.012.png 732489819.013.png 732489819.014.png
Technikę
obsługi openID , ale middleware, takie jak np.
AuthKit , bezproblemowo dodają te funkcjo-
nalności do frameworka. Chęć przestrzega-
nia specyfikacji jest w społeczności tak du-
ża, że trzeci duży framework – TurboGears
zawiesił rozwój dotychczasowego niezgodne-
go z WSGI drzewa 1.X tworząc zarazem roz-
wojową obecnie gałąź 2.X, zgodną z WSGI .
Dla programistów rozwijających framewor-
ka oznacza to przepisanie wielu modułów
TurboGears .
W PHP standaryzacja rozwiązań kuleje. Na-
wet na poziomie nazw funkcji trafimy na róż-
ne style nazewnictwa. W kategorii komponen-
tów sprawę nieco wyjaśnia PEAR , lecz czy Co-
deIgniter , Symfony lub Zend Framework bez-
boleśnie integrują API pakietów PEAR ? Nie-
stety nie.
Zend Framework i ezComponents jako zbiór
luźniejszych komponentów, które łatwiej wy-
korzystywać w innych frameworkach, dają na-
dzieję, lecz na tak daleko posuniętą standary-
zację jak w przypadku Pythona nie mamy na
razie co liczyć.
Django kontra
CodeIgniter i spółka
Zajmiemy się teraz porównaniem obu frame-
worków, jak i drogi tworzenia aplikacji z ich
użyciem ( CodeIgniter opisany został w nume-
rze 2/2007 phpSolutions ). Django wykorzystuje
wzorzec MVC , lecz w porównaniu z CI wpro-
wadza kilka zmian. Pierwszą z nich jest nazwa
– MTV czyli Model-Template-View . W Django
model określa strukturę tabeli (logikę bazoda-
nową ogólnie), widok zawiera logikę aplikacji,
a szablon wygląd. Kolejna różnica dotyczy sa-
mego modelu. W przypadku CodeIgnitera mo-
del zawierał definicje różnych operacji na ba-
zie danych, takich jak pobieranie ostatnich
newsów, kasowanie i aktualizowanie wpisów.
W Django model definiuje strukturę tabeli, a
operacje wykonujemy w widokach za pomo-
ORMa .
Instalacja
Ostatnią wydaną wersją Django jest wersja
0.96. Pobieramy archiwum z frameworkiem ze
strony projektu i rozpakowujemy. Otwieramy
konsolę i przechodzimy do katalogu z kodem
Django . Wydajemy polecenie:
python setup.py install
Django wymaga kilku dodatkowych bibliotek
Pythona:
• Do obsługi SQLite Django używa pysqlite ;
Postgres: psycopg ;
• MySQL: mysql-python .
Tworzenie aplikacji w Django
Tworzenie projektu. Projekt składa się z aplika-
cji, np. CMS z różnych modułów. By stworzyć
projekt wystarczy wydać polecenie:
Przykładowy projekt Django
Zaprezentuję teraz prosty projekt Django – blog
z systemem newsów obrazujący sposób tworze-
nia projektów Django .
django-admin.py startproject NAZWA_PROJEKTU
django-admin.py startproject blog
Listing 1. Podłączenie bazy danych do naszego CMSa
Stworzone zostaną podstawowe pliki projek-
tu, możemy nawet uruchomić serwer Django
dla tego projektu.
DATABASE_ENGINE =
' sqlite3 ' # ' postgresql ', ' mysql ', ' sqlite3 ' lub ' ado_mssql '.
DATABASE_NAME =
' bazka . db ' # nazwa bazy danych lub ś cie ż ka dla bazy sqlite3
DATABASE_USER =
'' # u ż ytkownik bazy , puste dla sqlite3
DATABASE_PASSWORD =
'' # has ł o u ż ytkownika , puste dla sqlite3
DATABASE_HOST =
'' # host do bazy danych , puste localhost
DATABASE_PORT =
'' # Podaj port je ż eli niestandardowy , puste dla sqlite3 .
nast ę pnie zmieniamy j ę zyk i stref ę czasow ą :
TIME_ZONE = ' Europe / Warsaw '
LANGUAGE_CODE = ' pl '
Uruchamianie serwera Django
Z konsoli po przejściu do katalogu projektu wy-
konaj polecenie:
python manage.py runserver 8080
Komenda ta uruchomi deweloperski serwer
Django . Będzie on dostępny pod adresem http:
//localhost:8080/ .
Konfiguracja projektu – bazy danych
Django jest silnie powiązane z bazami danych
i do dalszych operacji będzie nam potrzeb-
na dostępna baza danych ( sqlite3 , mysql lub
postgresql ). Edytujemy settings.py i ustawia-
my SQLite jako naszą bazę danych: patrz Li-
sting 1.
Teraz zatrzymujemy serwer Django i syn-
chronizujemy bazę danych. Po dodaniu nowej
aplikacji, bądź danych do bazy danych nowe-
go projektu, musimy te dane zsynchronizować.
Służy do tego polecenie:
Listing 2. Model aplikacji wiadomości
from django . db import models
class News ( models . Model ):
news_title = models . CharField (
maxlength = 255 , verbose_name = ' Tytu ł' )
news_text = models . TextField (
verbose_name = ' Tre ść' )
news_date = models . DateTimeField (
auto_now_add = True , blank =
True , verbose_name = ' Data dodania ' )
class Meta :
verbose_name = "Wiadomość"
verbose_name_plural = "Wiadomości"
class Admin :
list_display = ( ' news_title ', ' news_date ' )
list_ilter = [ ' news_date ' ]
search_ields = [ ' news_title ', ' news_text ' ]
date_hierarchy = ' news_date '
def __str__ ( self ):
return self . news_title
python manage.py syncdb
W przypadku rozpoczynania pracy z bazą da-
nych Django zapyta nas też o dane głównego
admina projektu.
Tworzenie aplikacji
By stworzyć aplikację wystarczy wykonać pole-
cenie z katalogu projektu:
python manage.py startapp
NAZWA_APLIKACJI
python manage.py startapp news
30
04/2007
732489819.015.png 732489819.016.png 732489819.017.png 732489819.018.png 732489819.019.png 732489819.020.png 732489819.021.png 732489819.022.png
 
Python kontra PHP
Co stworzy katalog aplikacji wraz z plikami:
Szablony
Teraz wystarczy, że stworzymy szablo-
ny. Skorzystamy z darmowego szablonu.
Załóżmy, że zawiera on XHTML zawie-
ra katalog images oraz pliki: default.css i
index.html .
news/
__init__.py
models.py
views.py
• W katalogu projektu utwórz katalog
templates (na szablony) i site _ media
(na pliki statyczne);
• Dodaj ' templates ' (nazwę katalogu na sza-
blony) w settings.py do TEMPLATE _
DIRS .
TEMPLATE_DIRS = (
'templates',
)
Zbiór models.py zawiera modele naszej aplika-
cji. Kod modelu dla naszej przykładowej apli-
kacji przedstawia Listing 2.
Każdy model, klasa dziedziczy z
django.db.models.models , przez co może-
my zdefiniować strukturę poszczególnych
tabel. Pole CharField i TextField służą do prze-
chowywania tekstu, DateTimeField daty. Te-
raz edytujemy settings.py projektu. Do IN-
STALLED_APPS dodajemy naszą aplikację
( NAZWA_PROJEKTU.NAZWA_APLIKA-
CJI ), czyli blog.news . Zapisujemy i synchroni-
zujemy bazę danych.
• Katalog i plik css kopiujemy do /site _
media a index.html do /templates ;
• Edytujemy plik index.html i zastępujemy
przykładową treść tagiem:
{% block content %}{% endblock %};
• Znajdujemy <link rel="stylesheet"
type="text/css" href="default.css" /> ;
• Zamieniamy na <link rel="stylesheet"
type="text/css" href="/site _ media/
default.css" /> ;
• Tworzymy plik /templates/news _
list.html z kodem: Listing 4.
Edytuj plik urls.py i dodaj regułę:
(r'^site_media/(.*)$', 'django.views.static
.serve',
{'document_root': '/ŚCIEŻKA/DO/site_
media'}),
Listing 3. Dopasowanie adresów URL w urls.py
Panel Admina
By włączyć panel administracyjny wykonu-
jemy:
from django . conf . urls . defaults import *
from blog . news . models import *
urlpatterns = patterns ( '',
( r '^ admin /', include (
' django . contrib . admin . urls ' )) ,
( r '^/?$', ' django . views . generic .
list_detail . object_list ', {
' queryset ' : News . objects . all () .
order_by ( ' - id ' ) , ' paginate_by ' : 10 ,
' allow_empty ' : True , ' template_name ' :
' news_list . html ' } ) ,
( r '^/ ( ? P < page >[ 0 - 9 ]+) $',
' django . views . generic . list_detail . object_list ',
{ ' queryset ' : News . objects . all () . order_by ( ' - id ' ) ,
' paginate_by ' : 10 , ' allow_empty ' : True ,
' template_name ':' news_list . html ' } ) ,
)
• Do INSTALLED_APPS w settings.py doda-
jemy django.contrib.admin;
• Synchronizujemy bazę danych;
• Edytujemy urls.py i usuwamy komentarz
( # ) z wiersza:
(r'^admin/', include('django.contrib.
admin.urls')),
Panel Admina dostępny jest pod adresem
http://localhost:8080/admin/ i umożliwia
zarządzanie aplikacją – dodawanie, usu-
wanie i edytowanie wpisów wraz z opcja-
mi pomocniczymi jak listowanie i wyszu-
kiwanie.
Interfejs użytkownika
Mamy gotowy panel administratora wiado-
mości, lecz nie mamy jeszcze interfejsu od
strony użytkownika. Zaczynamy od zapro-
jektowania adresów URL. urls.py zawierają
listę powiązanych adresów URL z akcjami
wywoływanymi w przypadku dopasowania
URLa. Format:
Listing 4. Przykładowy plik news_list.html
{ % extends "index.html" % }
{ % block content % }
{ % if object_list % }
{ % for new in object_list % }
< h3 > {{ new . news_title }} < / h3 >
< p > {{ new . news_text }} ... {{
new . news_date | truncatewords : "1" }} < / p >
{ % endfor % }
{ % if has_previous % }
< div style = "text-align:center;" >
< a href = "/?page={{ previous }}" >
< b > Nowsze Wiadomo ś ci < / b >< / a >< / div >
{ % endif % }
{ % if has_next % }
< div style = "text-align:center;" >
< a href = "/?page={{ next }}" >
< b > Starsze Wiadomo ś ci < / b >< / a >< / div >
{ % endif % }
{ % else % }
Brak wiadomo ś ci
{ % endif % }
{ % endblock % }
(wyrażenie regularne, funkcja pythona
do wykonania [, opcjonalnie katalog])
urls.py powinien wyglądać tak: Listing 3.
W wielu frameworkach MVC, w tym miej-
scu, musielibyśmy napisać kontrolery (wido-
ki w Django ) wykonujące określone czynno-
ści. Lecz Django posiada coś takiego, jak Gene-
ryczne Widoki , czyli predefiniowane akcje ta-
kie jak: pokaż określony wpis, listuj wpisy ze
stronicowaniem i inne. W powyższym kodzie
urls.py użyliśmy generycznego django.vie
ws.generic.list_detail.object_list – li-
sty wpisów ze stronicowaniem. Teraz musi-
my tylko stworzyć szablony.
www.phpsolmag.org
31
732489819.023.png 732489819.024.png 732489819.025.png 732489819.026.png 732489819.027.png 732489819.028.png
Technikę
Otwieramy główną stronę swojej aplika-
cji w przeglądarce, wpisując adres http://
localhost:8080/ . Efekt przedstawiono na Ry-
sunku 2.
Trochę wyjaśnień, otóż zaczęliśmy od poda-
nia w settings.py nazwy katalogu na szablony,
następnie w urls.py podaliśmy regułę obsługu-
jącą pliki statyczne pod serwerem deweloper-
skim (w warunkach produkcyjnych to serwer
www tym się zajmuje). Pliki statyczne to gra-
fiki, pliki JS czy css , jak i inne, do których chce-
my mieć dostęp z poziomu aplikacji Django . Ko-
lejną czynnością było przystosowanie szablonu
HTML. Przypomnijmy sobie regułę serwującą
statyczne pliki:
świetla zawartość tego szablonu. Oprócz dzie-
dziczenia skorzystaliśmy z drugiego ważnego
elementu – bloków. W news_list.html podali-
śmy zawartość dla bloku content :
mie modelu poprzez wysokopoziomowe
typy pól.
Smaczki Django
Prezentowana przed chwilą aplikacja, nie
pokazała wszystkich możliwości framewor-
ka. Poznanie ich wymaga bardziej dokładne-
go poznania tego narzędzia, lecz poniżej opi-
szę kilka innych przydatnych komponentów
Django .
{% block content %}
tutaj zawartość
{% endblock %}
W efekcie wypełniliśmy index.html określoną
przez nas zawartością – listą newsów. Oczy-
wiście możemy stworzyć identyczną aplika-
cję w PHP, lecz kluczowym czynnikiem jest
tutaj szybkość tworzenia. Django jest bardzo
dobrym narzędziem, gdyż jego komponenty
umożliwiają bardzo wydajne tworzenie wyso-
kiej jakości aplikacji. W porównaniu do takie-
go samego programu wykonanego w CodeIgni-
terze różnice są następujące:
ORM Django
ORM mapuje strukturę bazy danych – po-
szczególnych tabel na obiekty. W Django obsłu-
ga ORMa jest bardzo prosta, a sam komponent
jest mocno rozbudowany. Propel dostępny dla
PHP niestety nie może pochwalić się tak czy-
stym i przyjemnym interfejsem.
Listing 5. przedstawia model dla systemu
blogów złożony z trzech tabel. Blog – nazwa i
opis blogów, Author Nazwisko i email auto-
rów. Entry – wpis dla danego bloga.
Zaprezentowany na listingu model prezen-
tuje obsługę powiązanych tabel – Entry ma
pole authors zależne od Author i pole blog za-
leżne od Blogs . Proste zależności wiele-do-
jednego określane są przez pola typu Foreign-
Key , zawierające jako parametr nazwę mode-
lu. Tak więc dany wpis ( Entry ) przypisany jest
do konkretnego autora i bloga. Django oferu-
je również obsługę zależności wiele-do-wielu
czyli np. gdyby taka zależność dotyczyła pola
blog , to dany wpis ( Entry ) mógłby być przy-
pisany do wielu blogów. Listing 6. przedsta-
wia operacje na rekordach wykonywane po-
przez ORM.
(r'^site_media/(.*)$', 'django.views.static
.serve',
{'document_root': '/ŚCIEŻKA/DO/site_
media'}),
r'^site _ media/(.*)$' – oznacza, iż
wszystkie pliki statyczne dostępne są przez
/site_media/plik_statyczny , tak więc musie-
liśmy zmienić odnośnik do pliku CSS . Ko-
lejnym etapem było zastąpienie przykłado-
wej treści przez tag bloku . Następnie stwo-
rzyliśmy drugi szablon dziedziczący in-
dex.html :
• Nie tworzymy tabeli w bazie danych, robi
to framework (dbając m.in. o indeksy);
• Mamy gotowy Panel Admina do zarządza-
nia aplikacjami;
Generyczne Widoki znacznie ułatwiają
tworzenie interfejsu od strony użytkowni-
ka;
• Model opisuje tabele bazy danych, a nie
operacje na nich – w przypadku CI bez
struktury tabel trudno byłoby je odtwo-
rzyć bazując na kodzie modeli (brak wy-
cieku informacji poza projekt);
• Walidacja na poziomie mapowania URLi
poprzez wyrażenia regularne i na pozio-
{% extends "index.html" %}
Szablony Django obsługują dziedziczenie –
news_list.html dziedziczy index.html , czyli wy-
Rysunek 1. Panel Admin w akcji
System uprawnień i użytkowników
Django oferuje również system użytkowni-
ków, grup oraz uprawnień. Przy synchroniza-
cji bazy danych mogłeś zauważyć, że dla każ-
dego modelu (klasy) tworzone są domyślnie
trzy „znaczniki” uprawnień: dodawanie, edy-
cja i usuwanie obiektu danego modelu. Można
też tworzyć własne. W Panelu administracji w
łatwy sposób możemy tworzyć grupy, zbiory
uprawnień jak również nadawać poszczegól-
nym użytkownikom uprawnienia i przypisy-
wać ich do istniejących grup. Wykorzystanie
tego systemu w praktyce jest bardzo łatwe, ja-
ko że w widoku bieżący użytkownik reprezen-
towany jest przez obiekt request.user . Najlepiej
obrazuje to Listing 7. zawierający kod proste-
go widoku.
Middleware
Middleware to pojęcie związane z WSGI,
obecnym również w Django . Middleware
może globalnie wpływać na żądania wysy-
łane do widoków, jak i na ich odpowiedzi.
Do czego można zastosować middleware ?
Np. do śledzenia aktywności użytkowników
na stronie – każde żądanie dowolnej strony
Rysunek 2. Widok strony głównej wiadomości
32
04/2007
732489819.029.png 732489819.030.png 732489819.031.png 732489819.032.png
 
Zgłoś jeśli naruszono regulamin