• Nie Znaleziono Wyników

Programowanie i projektowanie obiektowe CherryPy, Genshi Paweł Daniluk

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie i projektowanie obiektowe CherryPy, Genshi Paweł Daniluk"

Copied!
23
0
0

Pełen tekst

(1)

Programowanie i projektowanie obiektowe

CherryPy, Genshi

Paweł Daniluk

Wydział Fizyki

Jesień 2016

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 1 / 20

(2)

Aplikacje webowe

Podejście standardowe Serwer (np. Apache)

Pliki HTML, CSS i grafiki w odpowiednich katalogach Skrypty PHP

Pewna niedogodność

Trudno jest zrealizować przyjazne dla użytkownika adresy URL, np:

http://mojastrona.pl/blog/2013/05/11 Zamiast tego może być:

http://mojastrona.pl/blog.php?year=2013&month=05&day=11 Można stosować mod_rewrite.

Struktura plików/skryptów zazwyczaj nie odpowiada logicznej strukturze

serwisu.

(3)

Aplikacje webowe

Podejście standardowe Serwer (np. Apache)

Pliki HTML, CSS i grafiki w odpowiednich katalogach Skrypty PHP

Pewna niedogodność

Trudno jest zrealizować przyjazne dla użytkownika adresy URL, np:

http://mojastrona.pl/blog/2013/05/11 Zamiast tego może być:

http://mojastrona.pl/blog.php?year=2013&month=05&day=11 Można stosować mod_rewrite.

Struktura plików/skryptów zazwyczaj nie odpowiada logicznej strukturze serwisu.

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 2 / 20

(4)

CherryPy

Katalogi w strukturze plików serwisu odpowiadają klasom Elementy katalogów (pliki i podkatalogi) odpowiadają atrybutom Aplikacja jest autonomicznym serwerem webowym

Treść nie jest przechowywana w plikach, ale generowana na bieżąco. Zazwyczaj konieczne jest połączenie z bazą danych (np.

SQLAlchemy).

HTML wygodnie jest tworzyć przy pomocy tzw. template processor (np. Genshi)

Możliwe jest serwowanie plików statycznych

Współpraca z serwerem Apache (na kilka sposobów)

SSL

(5)

CherryPy

Katalogi w strukturze plików serwisu odpowiadają klasom Elementy katalogów (pliki i podkatalogi) odpowiadają atrybutom Aplikacja jest autonomicznym serwerem webowym

Treść nie jest przechowywana w plikach, ale generowana na bieżąco.

Zazwyczaj konieczne jest połączenie z bazą danych (np.

SQLAlchemy).

HTML wygodnie jest tworzyć przy pomocy tzw. template processor (np. Genshi)

Możliwe jest serwowanie plików statycznych

Współpraca z serwerem Apache (na kilka sposobów) SSL

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 3 / 20

(6)

CherryPy

Katalogi w strukturze plików serwisu odpowiadają klasom Elementy katalogów (pliki i podkatalogi) odpowiadają atrybutom Aplikacja jest autonomicznym serwerem webowym

Treść nie jest przechowywana w plikach, ale generowana na bieżąco.

Zazwyczaj konieczne jest połączenie z bazą danych (np.

SQLAlchemy).

HTML wygodnie jest tworzyć przy pomocy tzw. template processor (np. Genshi)

Możliwe jest serwowanie plików statycznych

Współpraca z serwerem Apache (na kilka sposobów)

SSL

(7)

Hello World

hello.py

i m p o r t c h e r r y p y

c l a s s H e l l o W o r l d ( o b j e c t ) : d e f i n d e x ( s e l f ) :

r e t u r n " H e l l o ␣ World ! "

i n d e x . e x p o s e d = True

c h e r r y p y . q u i c k s t a r t ( H e l l o W o r l d ( ) )

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 4 / 20

(8)

Dostęp do żądania i odpowiedzi HTTP

Żądanie (ang. request) HTTP składa się z opisu żądania (GET lub POST, ścieżka), nagłówków i treści.

Odpowiedź (ang. response) HTTP składa się z kodu statusu, nagłówków i treści.

i m p o r t c h e r r y p y

c l a s s H e l l o W o r l d ( o b j e c t ) : d e f i n d e x ( s e l f ) :

r e s=" "

f o r k , v i n c h e r r y p y . r e q u e s t . h e a d e r s . i t e r i t e m s ( ) : r e s+="%s : ␣%s \ n " % ( k , v )

c h e r r y p y . r e s p o n s e . h e a d e r s [ ’ C o n t e n t −Type ’ ] = ’ t e x t / p l a i n ’ r e t u r n r e s

i n d e x . e x p o s e d = True

c h e r r y p y . q u i c k s t a r t ( H e l l o W o r l d ( ) )

(9)

Eksponowanie

Jedynie metody z atrybutem exposed są widoczne.

Przez atrybut

c l a s s Root ( o b j e c t ) : d e f i n d e x ( s e l f ) :

""" H a n d l e t h e / URI """

i n d e x . e x p o s e d = True

Przez dekorator

c l a s s Root ( o b j e c t ) :

@ c h e r r y p y . e x p o s e d e f i n d e x ( s e l f ) :

""" H a n d l e t h e / URI """

Atrybut klasy, jeżeli jest metoda __call__

c l a s s Node ( o b j e c t ) : e x p o s e d = True d e f __call__ ( s e l f ) :

""" """

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 6 / 20

(10)

Struktura serwisu

""" T h i s e x a m p l e c a n h a n d l e t h e U R I s : / −> Root . i n d e x

/ p a g e −> Root . p a g e / n o d e −> Node . __call__

"""

i m p o r t c h e r r y p y

c l a s s Node ( o b j e c t ) : e x p o s e d = T r u e d e f __call__ ( s e l f ) :

r e t u r n " The ␣ n o d e ␣ c o n t e n t "

c l a s s Root ( o b j e c t ) : d e f __init__ ( s e l f ) :

s e l f . n o d e = Node ( )

@ c h e r r y p y . e x p o s e d e f i n d e x ( s e l f ) :

r e t u r n " The ␣ i n d e x ␣ o f ␣ t h e ␣ r o o t ␣ o b j e c t "

d e f p a g e ( s e l f ) :

r e t u r n ’ T h i s ␣ i s ␣ t h e ␣ " p a g e " ␣ c o n t e n t ’ p a g e . e x p o s e d = T r u e

i f __name__ == ’__main__ ’ : c h e r r y p y . q u i c k s t a r t ( Root ( ) )

(11)

Argumenty eksponowanych metod

Nazwane

(nie ma rozróżnienia między GET a POST) c l a s s Root ( o b j e c t ) :

d e f d o L o g i n ( s e l f , u s e r n a m e=None , p a s s w o r d=None ) :

""" Check t h e u s e r n a m e & p a s s w o r d """

d o L o g i n . e x p o s e d = True

http://localhost/doLogin?username=user&password=pass

Pozycyjne

c l a s s Root ( o b j e c t ) :

d e f b l o g ( s e l f , y e a r , month , day ) :

""" D e l i v e r t h e b l o g p o s t . A c c o r d i n g t o ∗ y e a r ∗ ∗ month ∗ ∗ day ∗ . """

b l o g . e x p o s e d = True

http://localhost/blog/2005/01/17

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 8 / 20

(12)

Argumenty eksponowanych metod

Argumenty pozycyjne mogą być dopasowane do różnych metod. CherryPy znajduje “najlepiej pasującą”.

Przykład

/branch/leaf/4:

app.root.branch.leaf(’4’) app.root.branch(’leaf’, ’4’)

app.root.index(’branch’,’leaf’, ’4’)

(13)

Mnóstwo innych funkcji

obsługa sesji wtyczki i narzędzia SSL

logi cache

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 10 / 20

(14)

Łatwe generowanie HTML

Podejście tradycyjne Skrypt PHP

generowanie wyjścia wymieszane z obliczeniami program trudny w utrzymaniu

Genshi

HTML generowany na podstawie przekazanych obiektów Pythonowych rozszerzenia składni XHTML o dodatkowe atrybuty

możliwość osadzania kodu Pythonowego

(15)

Przykład

<? p y t h o n

t i t l e = "A␣ G e n s h i ␣ T e m p l a t e "

f r u i t s = [ " a p p l e " , " o r a n g e " , " k i w i " ]

?>

<h t m l x m l n s : p y=" h t t p : // g e n s h i . e d g e w a l l . o r g / ">

<head>

< t i t l e p y : c o n t e n t=" t i t l e ">T h i s i s r e p l a c e d .</ t i t l e >

</ head>

<body>

<p>These a r e some o f my f a v o r i t e f r u i t s : </ p>

<u l>

< l i p y : f o r=" f r u i t ␣ i n ␣ f r u i t s ">

I l i k e ${ f r u i t } s

</ l i >

</ u l>

</ body>

</ h t m l>

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 12 / 20

(16)

Przykład

Wynik

<h t m l>

<head>

< t i t l e >A G e n s h i T e m p l a t e</ t i t l e >

</ head>

<body>

<p>These a r e some o f my f a v o r i t e f r u i t s :</p>

<u l>

< l i > I l i k e a p p l e s</ l i >

< l i > I l i k e o r a n g e s</ l i >

< l i > I l i k e k i w i s</ l i >

</ u l>

</ body>

</ h t m l>

(17)

Z poziomu Pythona

>>> from genshi.template import MarkupTemplate

>>> tmpl = MarkupTemplate(’<h1>Hello, $name!</h1>’)

>>> stream = tmpl.generate(name=’world’)

>>> print(stream.render(’xhtml’))

<h1>Hello, world!</h1>

TemplateLoader

from g e n s h i . t e m p l a t e i m p o r t T e m p l a t e L o a d e r

l o a d e r = T e m p l a t e L o a d e r ( [ t e m p l a t e s _ d i r 1 , t e m p l a t e s _ d i r 2 ] ) t m p l = l o a d e r . l o a d ( ’ t e s t . h t m l ’ )

s t r e a m = t m p l . g e n e r a t e ( t i t l e = ’ H e l l o , ␣ w o r l d ! ’ ) p r i n t( s t r e a m . r e n d e r ( ) )

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 14 / 20

(18)

Dostęp do argumentów

>>> from genshi.template import MarkupTemplate

>>> tmpl = MarkupTemplate(’<em>$items[0].capitalize() item</em>’)

>>> print(tmpl.generate(items=[’first’, ’second’]))

<em>First item</em>

>>> from genshi.template import MarkupTemplate

>>> tmpl = MarkupTemplate(’<em>$dict.foo</em>’)

>>> print(tmpl.generate(dict=’foo’: ’bar’))

<em>bar</em>

Dostęp do elementów słownika i atrybutów obiektów jest możliwy w dwóch

notacjach: z kropką (obj.attr) i nawiasami kwadratowymi (obj[attr]).

(19)

Dyrektywy

if

<d i v p y : i f =" f o o ">

<p>Bar</ p>

</ d i v>

< p y : i f t e s t=" f o o ">

<d i v>

<p>Bar</ p>

</ d i v>

</ p y : i f>

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 16 / 20

(20)

Dyrektywy c.d.

choose

<d i v p y : c h o o s e=" ">

<s p a n p y : w h e n=" 0 ␣==␣ 1 ">0</ s p a n>

<s p a n p y : w h e n=" 1 ␣==␣ 1 ">1</ s p a n>

<s p a n p y : o t h e r w i s e=" ">2</ s p a n>

</ d i v>

<d i v p y : c h o o s e=" 1 ">

<s p a n p y : w h e n=" 0 ">0</ s p a n>

<s p a n p y : w h e n=" 1 ">1</ s p a n>

<s p a n p y : o t h e r w i s e=" ">2</ s p a n>

</ d i v>

<p y : c h o o s e t e s t=" 1 ">

<p y : w h e n t e s t=" 0 ">0</ p y : w h e n>

<p y : w h e n t e s t=" 1 ">1</ p y : w h e n>

< p y : o t h e r w i s e>2</ p y : o t h e r w i s e>

</ p y : c h o o s e>

(21)

Dyrektywy c.d.

for

<u l>

< l i p y : f o r=" i t e m ␣ i n ␣ i t e m s ">${ i t e m }</ l i >

</ u l>

<u l>

< p y : f o r e a c h=" i t e m ␣ i n ␣ i t e m s ">

< l i >${ i t e m }</ l i >

</ p y : f o r>

</ u l>

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 18 / 20

(22)

Dyrektywy c.d.

def

<d i v>

<p p y : d e f=" g r e e t i n g ( name ) " c l a s s =" g r e e t i n g ">

H e l l o , ${ name } !

</ p>

${ g r e e t i n g ( ’ w o r l d ’ ) }

${ g r e e t i n g ( ’ e v e r y o n e ␣ e l s e ’ ) }

</ d i v>

<d i v>

< p y : d e f f u n c t i o n=" g r e e t i n g ( name ) ">

<p c l a s s =" g r e e t i n g ">H e l l o , ${ name } !</ p>

</ p y : d e f>

</ d i v>

(23)

Przykład – Geddit?

http://genshi.edgewall.org/wiki/GenshiTutorial

P. Daniluk(Wydział Fizyki) PO w. IX Jesień 2016 20 / 20

Cytaty

Powiązane dokumenty

Wydaje się, że unikając nadmiernego generalizowania, w kontekście tak kryzysów współczesnych (XXI wiek), jak i wcześniejszych, należy raczej mówić o trzech

Utwórz w katalogu domowym dowiązanie symboliczne o nazwie aaa do pliku oryginal.. Utwórz w katalogu domowym dowiązanie sztywne o nazwie ccc do

‘&lt;opis obiektu&gt;’, który jest użyteczny przy debugowaniu – wywoływana przez repr(object). object.__str__(self) zwraca “ładny” napis – wywoływana

Czasami występuje potrzeba opisu klas, które łączą w sobie cechy kilku klas nadrzędnych (np. latająca łódź). Wielodziedziczenie może powodować straszne problemy (Deadly Diamond

Paradygmat obiektowy doskonale nadaje się do opisywania struktury i stanu dużych systemów.. Niestety takie systemy rzadko kiedy pozostają niezmienne

Funkcje i klasy dające możliwie prosty sposób wyrażania operacji na reprezentacjach przetwarzanych informacji..

Gwiezdne Wojny 1977 124 kolor Potężne Kaczory 1991 104 kolor Świat Wayne’a 1992 95 kolor.. Daniluk(Wydział Fizyki)

javax.sql.rowset.serial Provides utility classes to allow serializable mappings be- tween SQL types and data types in the Java programming language.. javax.sql.rowset.spi The