Jumpstart Django
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Jumpstart Django

  • 6,180 views
Uploaded on

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.

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.

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,180
On Slideshare
5,028
From Embeds
1,152
Number of Embeds
9

Actions

Shares
Downloads
213
Comments
0
Likes
14

Embeds 1,152

http://blog.insicdesigns.com 1,129
http://www.slideshare.net 11
http://robyates.org 3
http://translate.googleusercontent.com 2
http://127.0.0.1 2
http://www.slashdocs.com 2
http://insicdesigns.com 1
http://translate.yandex.net 1
http://www.techgig.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • Survey: How many do web application development; in django; in rails
  • Lawrence, Kansas
    Since 1850’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 “Database Journalism”
    Simon: Early work is part of many JS frameworks, Consultant on OpenID
    Joined by Jacob Kaplan-Moss
  • First online newspaper of it’s kind.
    Had a print edition of the website
  • “The CMS”
  • In a landscape of confusion - invent your own
  • Re-framed the perception of web development;
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’t do much magic
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’t do much magic
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’t do much magic
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’t do much magic
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’t do much magic
  • Various layers shouldn’t know about eachother unless absolutely necessary
    Code should lack boilerplate - Java
    Make tedious aspects fast - it’s just Python
    shouldn’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’t need to be HTML - JSON, e-mail, text
  • Complete separation of logic and presentation - pain for things like Math or comparisons.
    Templates don’t need to be HTML - JSON, e-mail, text
  • Complete separation of logic and presentation - pain for things like Math or comparisons.
    Templates don’t need to be HTML - JSON, e-mail, text
  • Complete separation of logic and presentation - pain for things like Math or comparisons.
    Templates don’t need to be HTML - JSON, e-mail, text
  • PHP comparison doesn’t count.
    Really a Django Rails comparison
  • Who is the clear winner?
  • Curl.com
  • Curl.com
  • Curl.com
  • Curl.com
  • Curl.com
  • Curl.com

Transcript

  • 1. Jumpstart The Web Framework for Perfectionists with Deadlines CPOSC Rob Yates October, 2009
  • 2. Topics
  • 3. Topics • What is Django
  • 4. Topics • What is Django • History of Django
  • 5. Topics • What is Django • History of Django • Whirlwind Tour
  • 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
  • 10. What is Django?
  • 11. What is Django? • Not a Gypsy Jazz Guitarist
  • 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)
  • 15. It all started HERE Photo by Jeff Croft
  • 16. Simon Willison Adrian Holovaty
  • 17. PyCon 2005 Major topic: Why is web development in Python so hard?
  • 18. Jump to today: Guiding Principles
  • 19. Jump to today: Guiding Principles • Loose Coupling and tight cohesion
  • 20. Jump to today: Guiding Principles • Loose Coupling and tight cohesion • Less code
  • 21. Jump to today: Guiding Principles • Loose Coupling and tight cohesion • Less code • Quick development
  • 22. Jump to today: Guiding Principles • Loose Coupling and tight cohesion • Less code • Quick development • DRY
  • 23. Jump to today: Guiding Principles • Loose Coupling and tight cohesion • Less code • Quick development • DRY • Explicit is better than implicit
  • 24. Jump to today: Guiding Principles • Loose Coupling and tight cohesion • Less code • Quick development • DRY • Explicit is better than implicit • Consistency
  • 25. 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
  • 26. Model View Controller
  • 27. Model View Controller Model View Template
  • 28. Models Templates App Views Models Templates App Views Site Models Templates App Views Settings URLs Django App Structure Templates
  • 29. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 30. 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']
  • 31. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 32. Deep Dive: DB API post = Post(title=‘Foo’, body=‘Bar’) post.type = ‘rant’ post.save()
  • 33. 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)
  • 34. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 35. 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)
  • 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) # Form based on a model class PostForm(forms.ModelForm): class Meta: model = Post
  • 37. Deep Dive: Views def posts_by_type(request, type): posts = Post.objects.filter(type=type) return render_to_response( ‘postsbytype.html’, {‘posts’: posts})
  • 38. Deep Dive: Views def posts_by_type(request, type): posts = Post.objects.filter(type=type) return render_to_response( ‘postsbytype.html’, {‘posts’: posts}) def new_post(request): if request.method == ‘POST’: form = PostForm(request.POST) if form.is_valid(): form.save() else: form = PostForm() return render_to_response( ‘mytemplate.html’, {‘form’: form})
  • 39. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 40. Deep Dive: URLs urlpatters = patterns(‘’, (’^my/favorite/color/$’, ‘blog.views.my_fav_color’), (‘^post/new/$’, ‘blog.views.new_post’), (‘^posts/(d{4})/$’, ‘blog.views.year_archive’), (‘^posts/(d{4})/(d{2})/$’, ‘blog.views.month_archive’), (‘^posts/(?P<slug>[a-z-]*)/$’, ‘blog.views.show_post’), (‘^events/$’, include(events.urls), )
  • 41. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 42. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 43. Deep Dive: Templates <html><body> {% if posts %} {% for post in posts %} {{ post.author }}: {{ post.title }} {% endfor %} {% endif %}
  • 44. Deep Dive: Templates <html><body> {% if posts %} {% for post in posts %} {{ post.author }}: {{ post.title }} {% endfor %} {% endif %} <form method=”post”> <table> {{ form }} </table> </form>
  • 45. 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>
  • 46. Architecture RDBMS Storage ORM Fixtures Model Signals Forms Template URL Resolver View Template Loader Middleware Middleware Request Response
  • 47. 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)
  • 48. 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
  • 49. 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
  • 50. Roll Your Own • Model Managers: Custom database API for views • Custom Template Tags: Easier to implement functionality without mixing logic/presentation
  • 51. 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
  • 52. 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
  • 53. Framework Death-match Photo by Bruce Turner
  • 54. Death-match: RoR • URL Handling • RoR: RESTful with HTTP verbs • Django: RegEx-based URL patterns • JavaScript / AJAX • RoR: XHR helpers with RJS, prototype, scriptaculous • Django: JS framework agnostic / no helpers besides serialization
  • 55. 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
  • 56. 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
  • 57. Death-match: RoR • Jobs: Rails jobs out-number Django jobs 6:1 • Hype: Rails has done a fantastic job with marketing
  • 58. Death-match: RoR • Jobs: Rails jobs out-number Django jobs 6:1 • Hype: Rails has done a fantastic job with marketing
  • 59. Recap
  • 60. Recap • Django is easy
  • 61. Recap • Django is easy • Django is fun
  • 62. Recap • Django is easy • Django is fun • Django scales
  • 63. Recap • Django is easy • Django is fun • Django scales • Django is maintainable
  • 64. Recap • Django is easy • Django is fun • Django scales • Django is maintainable • Django saves small kittens
  • 65. Recap • Django is easy • Django is fun • Django scales • Django is maintainable • Django saves small kittens • It rocks - USE IT!
  • 66. Resources • http://djangoproject.com • Check out the tutorial! • http://docs.djangoproject.com • http://djangodose.com • http://www.b-list.org/ • http://pinaxproject.com • http://code.google.com/hosting/search? q=label%3aDjango
  • 67. Thanks! rob@robyates.org Twitter: @Rob_Yates http://robyates.org