78
Introduction Paradigms The Admin Interface The Django Advantage Djangoic approach to implement common web development paradigms Lakshman Prasad April 20, 2011

djangoic approach to implement common web development paradigms

Embed Size (px)

DESCRIPTION

Web development frameworks conceptualize various abstractions to make common web development paradigms easy to implement. These abstractions have to be "transparent" in that they enable developer to override where necessary. Django, a modern python framework provides a full stack framework and has pioneered best practices in defining these abstractions for various web application paradigms such as Authentication, Permissions, Sessions, Caching, Security from CSRF, File Storage, Form Validation, etc. The abstractions provided by django are transparent and extensible and are as such referred to in the community to be "Djangoic"The session covers these abstractions, their defaults and using some of their transparencies to achieve a few non-default common ends such as using cloud storage services like Amazon web services, Implementing LDAP authentication, Implementing caching using Memcached, database and NoSQL data stores. The biggest take away to the developer is the ability to identify and create other Djangoic solutions that are transparent abstractions by examining the ones implemented within django and developed by the community in open source applications.

Citation preview

Page 1: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Djangoic approach to implement common webdevelopment paradigms

Lakshman Prasad

April 20, 2011

Page 2: djangoic approach to implement common web development paradigms

Concepts and abstractions used to represent elements of a program

Page 3: djangoic approach to implement common web development paradigms

CS is neither about computers nor is science - Abelson, SICP, MIT

Page 4: djangoic approach to implement common web development paradigms

Web Development Paradigms: Modeling common web patterns

Page 5: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Why

Page 6: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

• For building database driven web applications

• Emphasis on Reuse, DRY and simplicity

Page 7: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

• For building database driven web applications

• Emphasis on Reuse, DRY and simplicity

Page 8: djangoic approach to implement common web development paradigms

Batteries Included

Page 9: djangoic approach to implement common web development paradigms

docs.djangoproject.com

Page 10: djangoic approach to implement common web development paradigms

Lets examine the batteries

Page 11: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

About Me• Active Djangonaut and active in Python world• Part of a few popular open source django applications

github.com/becomingGuru.• Co-Authored an ebook ”django-design-patterns”• Architect and develop django applications at InMobi• Earlier, Consulting and Development via Agiliq Solutions• Developed several custom proprietory django applications

• twitter.com/becomingGuru http://becomingguru.com

Page 12: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

A nerd, for a while

Page 13: djangoic approach to implement common web development paradigms

consulting since, until recently

Page 14: djangoic approach to implement common web development paradigms

Always been developing

Page 15: djangoic approach to implement common web development paradigms

Work at InMobi now

Page 16: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

IntroductionDefinitionAbout MeAbstractions

ParadigmsFormsAuthentication/Caching/SessionsInernational/Human/Local ..izationGeneric ViewsSorting/Pagination/DataBrowse/GRID/Messages/Other

The Admin InterfaceAdminDatabrowse

The Django AdvantageUsersCommunityEndnotes

Page 17: djangoic approach to implement common web development paradigms

Software span a spectrum

Page 18: djangoic approach to implement common web development paradigms

Those that interact with hardware

Page 19: djangoic approach to implement common web development paradigms

The nuts and bolts

Page 20: djangoic approach to implement common web development paradigms

Those that solve a human problem ...

Page 21: djangoic approach to implement common web development paradigms

... that are Complex Systems

Page 22: djangoic approach to implement common web development paradigms

Frameworks come in between ...

Page 23: djangoic approach to implement common web development paradigms

... to achieve balance ...

Page 24: djangoic approach to implement common web development paradigms

... and reduce cost of maintainance and development

Page 25: djangoic approach to implement common web development paradigms

Common Frameworks

Page 26: djangoic approach to implement common web development paradigms

Forms

Page 27: djangoic approach to implement common web development paradigms

Save form data to a table

Page 28: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Use a Model Form

>>> from django . forms import ModelForm

# C r e a t e th e form c l a s s .>>> c l a s s A r t i c l e F o r m ( ModelForm ) :. . . c l a s s Meta :. . . model = A r t i c l e

# C r e a t i n g a form to add an a r t i c l e .>>> form = A r t i c l e F o r m ( )

# C r e a t i n g a form to change an e x i s t i n g a r t i c l e .>>> a r t i c l e = A r t i c l e . o b j e c t s . g e t ( pk=1)>>> form = A r t i c l e F o r m ( i n s t a n c e=a r t i c l e )

Page 29: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Save Foreign Keys

Page 30: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Use Model Formset

from d jango . forms . models import mode l f o rm s e t f a c t o r yAuthorFormSet = mode l f o rm s e t f a c t o r y ( Author )f o rmse t = AuthorFormSet ( )

>>> p r i n t f o rmse t<i n pu t type=” h idden ” name=”form−TOTAL FORMS”va l u e=”1” i d=” id fo rm−TOTAL FORMS” /><i n pu t type=” h idden ” name=”form−INITIAL FORMS”va l u e=”0” i d=” id fo rm−INITIAL FORMS” /><i n pu t type=” h idden ” name=”form−MAX NUM FORMS”i d=” id fo rm−MAX NUM FORMS” /><t r><th>< l a b e l f o r=” id fo rm−0−name”>Name:</ l a b e l></th><td><i n pu t i d=” id fo rm−0−name” type=” t e x t ”name=”form−0−name” maxlength=”100” /></td></t r>

Page 31: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Model Formset options

f o r m s e t = AuthorFormSet ( qs=Author . o b j e c t s . a l l ( ) ,e x t r a =5)

f o r m s e t . i s v a l i d ( )

f o r m s e t . e r r o r s{ ’ name ’ : ’ Th i s f i e l d i s r e q u i r e d ’ }

f o r m s e t . c h a n g e d f o r m s

f o r m s e t . s a v e ( )

Page 32: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Form pre populated

Page 33: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Forms dont have to save to a Model

from django import fo rms

c l a s s ContactForm ( forms . Form ) :s u b j e c t = forms . C h a r F i e l d ( m a x l e n g t h =100)message = forms . C h a r F i e l d ( )s e n d e r = forms . E m a i l F i e l d ( )c c m y s e l f = forms . B o o l e a n F i e l d ( r e q u i r e d=F a l s e )

def s a v e ( s e l f ) :#Do a n y t h i n g. . .

Page 34: djangoic approach to implement common web development paradigms

Form Preview

Page 35: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Form Preview

from django . c o n t r i b . f o r m t o o l s . p r e v i e w import FormPreviewfrom myapp . models import SomeModel

#Add a u r l( r ’ ˆ p o s t /$ ’ , SomeModelFormPreview ( SomeModelForm ) ) ,

#D e f i n e form p r e v i e w

c l a s s SomeModelFormPreview ( FormPreview ) :

def done ( s e l f , r e q u e s t , c l e a n e d d a t a ) :# Do someth ing w i t h t he c l e a n e d d a t a , then# r e d i r e c t to a ” s u c c e s s ” page .return H t t p R e s p o n s e R e d i r e c t ( ’ / form / s u c c e s s ’ )

Page 36: djangoic approach to implement common web development paradigms

Form Wizard

Page 37: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Form Wizard

c l a s s ContactWizard ( FormWizard ) :def done ( s e l f , r e q u e s t , f o r m l i s t ) :

d o s o m e t h i n g w i t h t h e f o r m d a t a ( f o r m l i s t )return H t t p R e s p o n s e R e d i r e c t ( ’ / r e d i r e c t / ’ )

Page 38: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

CSRF Protection

<form a c t i o n=”” method=” p o s t ”>{% c s r f t o k e n %}

from django . v i e w s . d e c o r a t o r s . c s r f import c s r f p r o t e c tfrom django . t e m p l a t e import R e q u e s t C o n t e x t

@ c s r f p r o t e c tdef my view ( r e q u e s t ) :

c = {}# . . .return r e n d e r t o r e s p o n s e ( ” a t e m p l a t e . html ” , c ,

c o n t e x t i n s t a n c e=R e q u e s t C o n t e x t ( r e q u e s t ) )

Page 39: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Authentication: Point to url pattern

u r l p a t t e r n s += p a t t e r n s ( ’ d jango . c o n t r i b . auth . v i e w s ’ ,u r l ( r ’ ˆ l o g i n /$ ’ , ’ l o g i n ’ ) ,u r l ( r ’ ˆ l o g o u t /$ ’ , ’ l o g o u t ’ ) ,u r l ( r ’ ˆ r e g i s t e r /$ ’ , ’ r e g i s t e r ’ ) ,u r l ( r ’ ˆ p a s s r e s e t /$ ’ , ’ p a s s w o r d r e s e t ’ ) ,u r l ( r ’ ˆ p a s s r e s e t 2 /$ ’ , ’ p a s s w o r d r e s e t d o n e ’ ) ,u r l ( r ’ ˆ p a s s r e s e t c o n f i r m /(?P<uidb36 >[−\w]+)/ ’ ,

’ p a s s w o r d r e s e t c o n f i r m ’ ) ,u r l ( r ’ ˆ p a s s r e s e t c o m p l e t e /$ ’ ,

’ p a s s w o r d r e s e t c o m p l e t e ’ ) ,)

Page 40: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Login Required

from django . c o n t r i b . auth . d e c o r a t o r s import \l o g i n r e q u i r e d

@ l o g i n r e q u i r e d ( r e d i r e c t f i e l d n a m e= ’ r e d i r e c t t o ’ )def my view ( r e q u e s t ) :

. . .

Page 41: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Authentication backends

c l a s s S e t t i n g s B a c k e n d :”””A u t h e n t i c a t e a g a i n s t t he s e t t i n g s ADMIN LOGINand ADMIN PASSWORD.”””def a u t h e n t i c a t e ( s e l f , username=None , password=None ) :

i f l o g i n v a l i d and p w d v a l i d :return u s e r

return None

def g e t u s e r ( s e l f , u s e r i d ) :t ry :

return User . o b j e c t s . g e t ( pk=u s e r i d )except User . DoesNotEx i s t :

return None

Page 42: djangoic approach to implement common web development paradigms

django-socialauth

Page 43: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Open ID backendc l a s s OpenIdBackend :

def a u t h e n t i c a t e ( s e l f , open id key , r eque s t , p r o v i d e r , u s e r=None ) :t r y :

a s s o c = Us e rA s s o c i a t i o n . o b j e c t s . ge t ( open i d k e y=open i d k e y )r e t u r n a s soc . u s e r

except Us e rA s s o c i a t i o n . DoesNotEx i s t :#f e t c h i f open id p r o v i d e r p r o v i d e s any s imp l e r e g i s t r a t i o n f i e l d si f r e q u e s t . open id and r e q u e s t . open id . s r e g :

ema i l = r e q u e s t . open id . s r e g . ge t ( ’ ema i l ’ )nickname = r e qu e s t . open id . s r e g . ge t ( ’ nickname ’ )f i r s t n ame , l a s tname = ( r e qu e s t . open id . s r e g

. ge t ( ’ f u l l n ame ’ , ’ ’ )r e t u r n u s e r

def GooglesAX ( s e l f , o p e n i d r e s p on s e ) :ema i l = ( op e n i d r e s p on s e . ax

. g e t S i n g l e ( ’ h t tp : // axschema . org / con ta c t / ema i l ’ ) )f i r s t n ame = ( op en i d r e s p on s e . ax

. g e t S i n g l e ( ’ h t tp : // axschema . org /namePerson/ f i r s t ’ ) )l a s tname = ( op en i d r e s p on s e . ax

. g e t S i n g l e ( ’ h t tp : // axschema . org /namePerson/ l a s t ’ ) )r e t u r n l o c a l s ( )

def g e t u s e r ( s e l f , u s e r i d ) :t r y :

u s e r = User . o b j e c t s . ge t ( pk=u s e r i d )r e t u r n u s e r

except User . DoesNotEx i s t :r e t u r n None

Page 44: djangoic approach to implement common web development paradigms

”Normalized data is for sissies” - Cal Henderson

Page 45: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Different blocks need different caching durations

Page 46: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Generally Memcache Every page

CACHE BACKEND = ’ memcached : / / 1 2 7 . 0 . 0 . 1 : 1 1 2 1 1 / ’CACHE BACKEND = ’ memcached : / / 1 7 2 . 1 9 . 2 6 . 2 4 0 : 1 1 2 1 1 ;\1 7 2 . 1 9 . 2 6 . 2 4 2 : 1 1 2 1 2 ; 1 7 2 . 1 9 . 2 6 . 2 4 4 : 1 1 2 1 3 / ’

Page 47: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Implement a caching decorator

from django . c o r e . cache import cachedef c a c h e f o r ( seconds , f e t c h =0):

def c a c h e i t ( f u n c ) :def d e c o f u n c ( s e l f ) :

v a l = cache . g e t ( s e l f . g e t c a c h e k e y ( f e t c h ) )i f not v a l :

v a l = f u n c ( s e l f )cache . s e t ( s e l f . g e t c a c h e k e y ( f e t c h ) ,

v a l , s e c o n d s )return v a l

return d e c o f u n creturn c a c h e i t

Page 48: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Apply on the blocks

c l a s s T w i t t e r B l o c k ( T w i t t e r S e a r c h B l o c k ) :

template name = ’ t w i t t e r u s e r b l o c k . html ’a j a x t e m p l a t e = ’ t w e e t s u s e r . html ’

@ c a c h e f o r (60∗60 , f e t c h =1)def f e t c h d a t a ( s e l f ) :

tw = T w i t t e r ( e m a i l= ’ umoja com ’ )u s e r t w e e t s = tw . s t a t u s e s . u s e r t i m e l i n e (

sc reen name=s e l f . data )return u s e r t w e e t s , None

Page 49: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Different cache Backends

• Database

• File System

• Local Memory

• Redis, a NoSQL store

• Dummy- For Development

• Sessions can use any of these, or the database.

Page 50: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Humanization and Localization

19 Apr 2 0 1 0 | n a t u r a l d a y becomes ‘ y e s t e r d a y ‘ .20 Apr 2 0 1 0 | n a t u r a l d a y becomes ‘ today ‘ .

1 | o r d i n a l becomes ‘1 st ‘ .2 | o r d i n a l becomes ‘2 nd ‘ .

1000000 | i n t w o r d becomes ‘ 1 . 0 m i l l i o n ‘ .1200000 | i n t w o r d becomes ‘ 1 . 2 m i l l i o n ‘ .

{{ v a l u e | l o c a l i z e }}

Page 51: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Internationalization

{% b l o c k t r a n s w i t h amount=a r t i c l e . p r i c e %}That w i l l c o s t $ {{ amount }} .{% e n d b l o c k t r a n s %}

{% b l o c k t r a n s w i t h myvar=v a l u e | f i l t e r %}This w i l l have {{ myvar }} i n s i d e .{% e n d b l o c k t r a n s %}

c l a s s in . fo rms . I N S t a t e F i e l dc l a s s in . fo rms . I N Z i p C o d e F i e l dc l a s s in . fo rms . I N S t a t e S e l e c t

Page 52: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Using Generic Views

# some app / v i e w s . pyfrom django . v i e w s . g e n e r i c import TemplateView

c l a s s AboutView ( TemplateView ) :template name = ” about . html ”

# u r l s . pyfrom django . c o n f . u r l s . d e f a u l t s import ∗from some app . v i e w s import AboutView

u r l p a t t e r n s = p a t t e r n s ( ’ ’ ,( r ’ ˆ about / ’ , AboutView . a s v i e w ( ) ) ,

)

Page 53: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

List and Object Views

from django . v i e w s . g e n e r i c import L i s t V i e wfrom books . models import Book

c l a s s AcmeBookListView ( L i s t V i e w ) :

c o n t e x t o b j e c t n a m e = ” b o o k l i s t ”q u e r y s e t = Book . o b j e c t s . f i l t e r ( p u b l i s h e r n a m e=”Acme P u b l i s h i n g ” )template name = ” books / a c m e l i s t . html ”

Page 54: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Mixins

from d jango import ht tpfrom d jango . u t i l s import s imp l e j s o n as j s o n

c l a s s JSONResponseMixin ( o b j e c t ) :def r e n d e r t o r e s p o n s e ( s e l f , c on t e x t ) :

” Retu rns a JSON re spon s e c o n t a i n i n g ’ c on t e x t ’ as pay load ”r e t u r n s e l f . g e t j s o n r e s p o n s e ( s e l f . c o n v e r t c o n t e x t t o j s o n ( con t e x t ) )

def g e t j s o n r e s p o n s e ( s e l f , content , ∗∗h t t p r e s p on s e kwa r g s ) :” Cons t r u c t an ‘ HttpResponse ‘ o b j e c t . ”r e t u r n ht tp . HttpResponse ( content ,

c o n t e n t t y p e=’ a p p l i c a t i o n / j s o n ’ ,∗∗h t t p r e s p on s e kwa r g s )

def c o n v e r t c o n t e x t t o j s o n ( s e l f , c on t e x t ) :” Conver t the con t e x t d i c t i o n a r y i n t o a JSON ob j e c t ”r e t u r n j s o n . dumps ( con t e x t )

Page 55: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Any combinations of Mixins

c l a s s Hyb r i dDe ta i lV i ew ( JSONResponseMixin ,S ing l eOb jec tTemp la teResponseMix in ,BaseDeta i lV i ew ) :

def r e n d e r t o r e s p o n s e ( s e l f , c on t e x t ) :# Look f o r a ’ fo rmat=j s o n ’ GET argumenti f s e l f . r e q u e s t .GET. ge t ( ’ fo rmat ’ , ’ html ’ ) == ’ j s o n ’ :

r e t u r n JSONResponseMixin . r e n d e r t o r e s p o n s e ( s e l f , c on t e x t )e l s e :

r e t u r n S ing l eOb j ec tTemp la t eResponseMix i n . r e n d e r t o r e s p o n s e ( s e l f ,c on t e x t )

Page 56: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Types of Generic Views

• Simple: Redirect, Render to Template

• Detail, List View

• Archive View: Date, Month, Year views

• Basic CRUD, with or w/o Auth

Page 57: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Builtin support for Pagination

>>> from django . c o r e . p a g i n a t o r import P a g i n a t o r>>> o b j e c t s = [ ’ j o h n ’ , ’ p a u l ’ , ’ g e o r g e ’ , ’ r i n g o ’ ]>>> p = P a g i n a t o r ( o b j e c t s , 2)

>>> p . count4>>> p . num pages2>>> p . p a g e r a n g e[ 1 , 2 ]

>>> page1 = p . page ( 1 )>>> page1<Page 1 o f 2>>>> page1 . o b j e c t l i s t[ ’ j o h n ’ , ’ p a u l ’ ]

Page 58: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Abstract the pagination in middleware

d j a n g o p a g e n a t i o n

{% a u t o p a g i n a t e o b j e c t l i s t 10 %}

{% p a g i n a t e %}

Page 59: djangoic approach to implement common web development paradigms

DataGrid enables user customisable column and sorting

Page 60: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Other common paradigms

• Display Image Thumbnail

• Store data on a CDN, like Amazon S3

• Periodic tasks with Celery

• Decoupled design using Signals

• GeoDjango : Framework for all location based applications

Page 61: djangoic approach to implement common web development paradigms
Page 62: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Admin by models alone

Page 63: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Admin Syntax

from django . c o n t r i b import adminfrom models import Post , Comment

c l a s s PostAdmin ( admin . ModelAdmin ) :l i s t d i s p l a y = ( ’ t i t l e ’ , ’ d a t e t i m e ’ )

c l a s s CommentAdmin ( admin . ModelAdmin ) :l i s t d i s p l a y = ( ’ t e x t ’ , )

admin . s i t e . r e g i s t e r ( Post , PostAdmin )admin . s i t e . r e g i s t e r ( Comment , CommentAdmin )

Page 64: djangoic approach to implement common web development paradigms

List Page

Page 65: djangoic approach to implement common web development paradigms

Add an Entry

Page 66: djangoic approach to implement common web development paradigms

Auto Validation

Page 67: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Databrowse enables browsable web complete withhyperlinks

Page 68: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Popular Users

• Media• LA Times• NY Times• Washington Post• Guardian• Hindustan TImes

• Web2.0• Mahalo: 10 million Page views• Many web startups: Convore, Lanyard, Everyblock,

GroupQuality,

Page 69: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Popular Users

• Media• LA Times• NY Times• Washington Post• Guardian• Hindustan TImes

• Web2.0• Mahalo: 10 million Page views• Many web startups: Convore, Lanyard, Everyblock,

GroupQuality,

Page 70: djangoic approach to implement common web development paradigms

Django users

Page 71: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

NASA uses Django

After an extensive trade study, we selected Django ...as the first and primary application environment for theNebula Cloud.

Page 72: djangoic approach to implement common web development paradigms

700 contibutors

Page 73: djangoic approach to implement common web development paradigms

More open source projects than you think ...

Page 74: djangoic approach to implement common web development paradigms

... one for every size and style

Page 75: djangoic approach to implement common web development paradigms

Don’t go where the puck is; go where the puck is going to be

Page 76: djangoic approach to implement common web development paradigms
Page 77: djangoic approach to implement common web development paradigms

Introduction Paradigms The Admin Interface The Django Advantage

Image Attributions

ht tp : //www. f l i c k r . com/ photos / t e j e d o r o d e l u z /3157690060/ht tp : //www. f l i c k r . com/ photos /23820645@N05/4287681570/ht tp : //www. f l i c k r . com/ photos / a i d a n j o n e s /3575000735/ht tp : // j a c o b i a n . org /h t tp : // s a n j u a n c o l l e g e . edu/ l i b / images / p h i l o s o p h y b r a i n . j pgh t tp : //www. f l i c k r . com/ photos /uhop /105062059/ht tp : // s3 . amazonaws . com/memebox/ up load s /136/ e x p o n e n t i a l g r a p h 2 . j pgh t tp : // geekandpoke . typepad . com/geekandpoke / images /2008/06/03/ s e xp l 1 8 . j pgh t tp : //www. f l i c k r . com/ photos /go /253819/ht tp : // a round the sphe r e . f i l e s . wo rdp re s s . com/2009/05/ sw i s s−army−k n i f e . j pgh t tp : //www. f r e e f o t o . com/ images /41/04/41 04 9−−−Keep−Le f t web . j pgh t tp : //www. f l i c k r . com/ photos / o r i n r o b e r t j o h n /114430223/