An overview of the Django rapid application development framework. Topics include the history of the framework, an architectural overview, how to get started, and a brief comparison to Ruby on Rails.
6. Topics
• What is Django
• History of Django
• Whirlwind Tour
• How to Get Started - Admin Demo
7. Topics
• What is Django
• History of Django
• Whirlwind Tour
• How to Get Started - Admin Demo
• Killer Features
8. Topics
• What is Django
• History of Django
• Whirlwind Tour
• How to Get Started - Admin Demo
• Killer Features
• Application Re-use and Pinax
9. Topics
• What is Django
• History of Django
• Whirlwind Tour
• How to Get Started - Admin Demo
• Killer Features
• Application Re-use and Pinax
• Framework Death-match
12. What is Django?
• Not a Gypsy Jazz Guitarist
• Web Application
Development Framework
written in and for Python
13. What is Django?
• Not a Gypsy Jazz Guitarist
• Web Application
Development Framework
written in and for Python
• Not a CMS System
14. What is Django?
• Not a Gypsy Jazz Guitarist
• Web Application
Development Framework
written in and for Python
• Not a CMS System
• Sometimes called Python’s
Ruby on Rails (RoR)
20. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
21. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
• Less code
22. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
• Less code
• Quick development
23. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
• Less code
• Quick development
• DRY
24. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
• Less code
• Quick development
• DRY
• Explicit is better than implicit
25. Jump to today:
Guiding Principles
• Loose Coupling and tight cohesion
• Less code
• Quick development
• DRY
• Explicit is better than implicit
• Consistency
26. For Free!!!
• Very Useful Admin CRUD
• Templating - lots of useful rendering bits
• Form Handling
• i18n - full Unicode support
• Sessions / User Auth / Role-based Perms
• Object-Relational Mapping
Beer photo by Lori Spindler
30. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
31. Deep Dive: Models
from tagging.fields import TagField
class Post(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique_for_month='pub_date')
body = models.TextField()
TYPE_CHOICES = (
('rant', 'Rant'),
('tirade', 'Tirade'),
)
type = models.CharField(choices=TYPE_CHOICES, max_length=50)
pub_date = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
tags = TagField(blank=True, null=True)
class Meta:
unique_together = ('title', 'type')
ordering = ['-pub_date']
32. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
33. Deep Dive: DB API
post = Post(title=‘Foo’, body=‘Bar’)
post.type = ‘rant’
post.save()
34. Deep Dive: DB API
post = Post(title=‘Foo’, body=‘Bar’)
post.type = ‘rant’
post.save()
posts = Post.objects.all()
posts = Post.objects.all()[:5]
posts = Post.objects.filter(post_type=‘rant’)
posts = Post.objects.filter(author__name=‘Rob’)
posts = Post.objects.filter(author__name=‘Rob’).
filter(title__contains=‘django’).order_by(‘type’)
post = Post.objects.get(id=24)
35. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
36. Deep Dive: Forms
# Basic Form
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
37. Deep Dive: Forms
# Basic Form
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
# Form based on a model
class PostForm(forms.ModelForm):
class Meta:
model = Post
42. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
43. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
44. Deep Dive: Templates
<html><body>
{% if posts %}
{% for post in posts %}
{{ post.author }}: {{ post.title }}
{% endfor %}
{% endif %}
45. Deep Dive: Templates
<html><body>
{% if posts %}
{% for post in posts %}
{{ post.author }}: {{ post.title }}
{% endfor %}
{% endif %}
<form method=”post”>
<table>
{{ form }}
</table>
</form>
46. Deep Dive: Templates
<html><body>
{% if posts %}
{% for post in posts %}
{{ post.author }}: {{ post.title }}
{% endfor %}
{% endif %}
<form method=”post”>
<ul>
{{ form.as_ul }}
</ul>
</form>
47. Architecture
RDBMS
Storage ORM Fixtures
Model
Signals Forms Template
URL Resolver View Template Loader
Middleware Middleware
Request Response
48. Getting Started
• Pure Python - no compiled code
• No dependencies (with the exception of
the database adapter of your choice
• Three-step install
• D/L and extract tar
• Run setup.py
• Add django-admin.py to path (optional)
49. Initialize Your Project
$ django-admin.py startproject mysite
$ cd mysite
$ python manage.py startapp myapp
$ edit settings.py and set DB Info
$ python manage.py runserver
http://localhost:8000
50. Killer Features
• Legacy DB • Generic Views
• Test Framework • Template Inheritance
• Multi-DB • Tempalte Filters
• Geodjango • Humanize
• Aggregation • Runs on Jython /
IronPython
• JSON Serializer
• Stable API Promise • Google AppEngine!
• Fantastic Docs
51. Roll Your Own
• Model Managers: Custom database API for views
• Custom Template Tags: Easier to implement
functionality without mixing logic/presentation
52. Roll Your Own
• Model Managers: Custom database API for views
• Custom Template Tags: Easier to implement
functionality without mixing logic/presentation
• ORM Layer • Model Fields
• Template Engine • Form Fields
• Template Loader • URL Resolver
53. Re-usable Apps
and Pinax
• Following best practices when creating
your app allows others to plug in and use it
• Search Google Code for *django* projects
returns 1,987 results - many are apps
• James Tauber created Django Hotclub to
establish standards for app development
and integration
• Hotclub later become Pinax
57. Death-match: RoR
• Unicode
• Ruby traditionally has had issues - string is byte sequence
• Python is fully Unicode since v1.6 (circa 2000)
• i18n
• RoR: Translations are copied - no fallback?
• Django: Translations use GNU gettext-style localization -
falls back to default language
58. Death-match: RoR
• Plugins
• RoR: Rich plugin API and structure
• Django: Re-usable applications
• Automation / Build
• RoR: rake is a rich scripting language for automated tasks
• Django: manage.py can do some basic tricks - CLI
59. Death-match: RoR
• Jobs: Rails jobs out-number Django jobs 6:1
• Hype: Rails has done a fantastic job with marketing
60. Death-match: RoR
• Jobs: Rails jobs out-number Django jobs 6:1
• Hype: Rails has done a fantastic job with marketing
Survey: How many do web application development; in django; in rails
Lawrence, Kansas
Since 1850&#x2019;s
Family run newspaper - currently run by someone who is 70 years old that does not use a computer - assistant prints out e-mails
Adrian: Chicago Crime, Coined the term &#x201C;Database Journalism&#x201D;
Simon: Early work is part of many JS frameworks, Consultant on OpenID
Joined by Jacob Kaplan-Moss
First online newspaper of it&#x2019;s kind.
Had a print edition of the website
&#x201C;The CMS&#x201D;
In a landscape of confusion - invent your own
Re-framed the perception of web development;
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
Various layers shouldn&#x2019;t know about eachother unless absolutely necessary
Code should lack boilerplate - Java
Make tedious aspects fast - it&#x2019;s just Python
shouldn&#x2019;t do much magic
manage.py syncdb
Those too hip for non-relational databases will have to wait.
Multi-DB support is coming.
Notice: more declarative programming
Notice: more declarative programming
You can generate these things dynamically
Middleware
Middleware
Middleware
Complete separation of logic and presentation - pain for things like Math or comparisons.
Templates don&#x2019;t need to be HTML - JSON, e-mail, text
Complete separation of logic and presentation - pain for things like Math or comparisons.
Templates don&#x2019;t need to be HTML - JSON, e-mail, text
Complete separation of logic and presentation - pain for things like Math or comparisons.
Templates don&#x2019;t need to be HTML - JSON, e-mail, text
Complete separation of logic and presentation - pain for things like Math or comparisons.
Templates don&#x2019;t need to be HTML - JSON, e-mail, text
PHP comparison doesn&#x2019;t count.
Really a Django Rails comparison