django a whirlwind tour

61
Django: A Whirlwind Tour Brad Montgomery Email: [email protected] Twitter: bkmontgomery Friday, November 2, 12

Upload: brad-montgomery

Post on 15-Dec-2014

473 views

Category:

Technology


0 download

DESCRIPTION

A quick introduction to Django with tips on deploying to Heroku. Presented at TechCamp Memphis, Fall 2012

TRANSCRIPT

Page 1: Django   a whirlwind tour

Django: A Whirlwind Tour

Brad Montgomery

Email: [email protected]: bkmontgomery

Friday, November 2, 12

Page 2: Django   a whirlwind tour

Django: Features

• Python

• ORM: Object-Relational Mapper

• MVC-inspired (MVT)

• Clean URLs

• Huge Community

• Worlds Best Documentation

Friday, November 2, 12

Page 3: Django   a whirlwind tour

Batteries Includedaka: contrib apps

• admin

• auth

• comments

• gis

• syndication (atom/rss feeds)

• sitemaps

Friday, November 2, 12

Page 4: Django   a whirlwind tour

https://djangoproject.com/

Friday, November 2, 12

Page 5: Django   a whirlwind tour

Community

• 3rd-party, open source apps

• django-registration

• django-social-auth

• django-taggit

• django-gravatar2

• django-relationships

Friday, November 2, 12

Page 6: Django   a whirlwind tour

http://djangopackages.com/

Friday, November 2, 12

Page 7: Django   a whirlwind tour

So, who’s actually using Django?

Friday, November 2, 12

Page 8: Django   a whirlwind tour

Disqus,Instagram,

Pintrest, Mozilla,Rdio, Bitbucket,Work for Pie,GiantBomb,The Onion

Friday, November 2, 12

Page 9: Django   a whirlwind tour

Projects & Apps

• Projects are a collection of applications

• Settings

• DB Connections

• installed apps

• Filesystem paths

• Command-line tool: manage.py

Friday, November 2, 12

Page 10: Django   a whirlwind tour

Projects & Apps

$ django-admin.py \ startproject \ sampleproject

Friday, November 2, 12

Page 11: Django   a whirlwind tour

Projects & Apps

sampleproject/!"" manage.py#"" sampleproject !"" __init__.py !"" settings.py !"" urls.py #"" wsgi.py

Friday, November 2, 12

Page 12: Django   a whirlwind tour

Projects & Apps

$ python manage.py \ startapp blog

Friday, November 2, 12

Page 13: Django   a whirlwind tour

Projects & Apps

sampleproject/!"" blog    !"" __init__.py    !"" models.py    !"" tests.py    #"" views.py

Friday, November 2, 12

Page 14: Django   a whirlwind tour

Modelsfrom django.db import modelsfrom django.contrib.auth.models import User

class Post(models.Model): author = models.ForeignKey(User) title = models.CharField(max_length=128) slug = models.SlugField(max_length=128, unique=True) content = models.TextField() published_on = models.DateTimeField(auto_now_add=True)

sampleproject/blog/models.py

Friday, November 2, 12

Page 15: Django   a whirlwind tour

syncdb

$ python manage.py syncdb

Friday, November 2, 12

Page 16: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 17: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 18: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 19: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 20: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 21: Django   a whirlwind tour

Viewsfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom models import Post

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

Friday, November 2, 12

Page 22: Django   a whirlwind tour

A base template<!DOCTYPE html><html><head> <title> {% block title %}{% endblock %} </title></head>

<body> {% block content %}{% endblock %}</body></html>

sampleproject/sampleproject/templates/base.html

Friday, November 2, 12

Page 23: Django   a whirlwind tour

A base template<!DOCTYPE html><html><head> <title> {% block title %}{% endblock %} </title></head>

<body> {% block content %}{% endblock %}</body></html>

sampleproject/sampleproject/templates/base.html

Friday, November 2, 12

Page 24: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 25: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 26: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 27: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 28: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 29: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 30: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 31: Django   a whirlwind tour

A post template{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Friday, November 2, 12

Page 32: Django   a whirlwind tour

URL Conf’s

• Tie it all together!

• Route HTTP requests to views

• May also capture values

Friday, November 2, 12

Page 33: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 34: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 35: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 36: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 37: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 38: Django   a whirlwind tour

Root URLConf

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

Friday, November 2, 12

Page 39: Django   a whirlwind tour

An HTTP Request

Friday, November 2, 12

Page 40: Django   a whirlwind tour

An HTTP Request

Friday, November 2, 12

Page 41: Django   a whirlwind tour

An HTTP Request

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

blog/sample-title/

Friday, November 2, 12

Page 42: Django   a whirlwind tour

An HTTP Request

from django.conf.urls import patterns, include, url

from django.contrib import adminadmin.autodiscover()

urlpatterns = patterns('', url(r'^blog/(?P<post_slug>.+)/$', 'blog.views.display_post', name='display_post'), url(r'^admin/', include(admin.site.urls)),)

sampleproject/sampleproject/urls.py

blog/sample-title/

Friday, November 2, 12

Page 43: Django   a whirlwind tour

An HTTP Request

def display_post(request, post_slug): post = Post.objects.get(slug=post_slug) template_data = {'post': post} template = "blog/post.html" return render_to_response( template, template_data, context_instance=RequestContext(request) )

sampleproject/blog/views.py

sample-title

Friday, November 2, 12

Page 44: Django   a whirlwind tour

An HTTP Request{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Sample Title

Friday, November 2, 12

Page 45: Django   a whirlwind tour

An HTTP Request{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Lorem Ipsum...

Friday, November 2, 12

Page 46: Django   a whirlwind tour

An HTTP Request{% extends "base.html" %}

{% block title %} {{ post.title }}{% endblock %}

{% block content %} <h1>{{ post.title }}</h1>

{{ post.content|urlize|linebreaks }}

<p>Published on: {{ post.published_on|date:"M d, Y" }}</p>{% endblock %}

sampleproject/blog/templates/blog/post.html

Nov 3, 2012

Friday, November 2, 12

Page 47: Django   a whirlwind tour

An HTTP Request

Friday, November 2, 12

Page 48: Django   a whirlwind tour

Friday, November 2, 12

Page 49: Django   a whirlwind tour

A Typical Stack

Linux

Friday, November 2, 12

Page 50: Django   a whirlwind tour

A Typical Stack

Linux

PostgreSQL

Friday, November 2, 12

Page 51: Django   a whirlwind tour

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

Friday, November 2, 12

Page 52: Django   a whirlwind tour

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

nginx

Friday, November 2, 12

Page 53: Django   a whirlwind tour

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

nginx

Varnish

Redis

RabbitMQ

Memcached

Friday, November 2, 12

Page 54: Django   a whirlwind tour

Friday, November 2, 12

Page 55: Django   a whirlwind tour

Enter: Heroku

• Deploy & Scale in the Cloud

• Provides on-demand App/DB servers

• The Heroku Toolbelt

• http://www.heroku.com/

Friday, November 2, 12

Page 56: Django   a whirlwind tour

Deploying to Heroku

$ heroku create

Creating app-name... done, stack is cedarhttp://app-name.herokuapp.com/ | [email protected]:app-name.gitGit remote heroku added

Do a little bit of setup...

Friday, November 2, 12

Page 57: Django   a whirlwind tour

Deploying to Heroku

$ git push heroku master

... lots of output ...

Friday, November 2, 12

Page 58: Django   a whirlwind tour

Deploying to Heroku

$ heroku run python manage.py syncdb

... your typical syncdb output ...

Friday, November 2, 12

Page 59: Django   a whirlwind tour

Deploying to Heroku

$ git push heroku master

Develop locally, then when you want to deploy, just run:

Friday, November 2, 12

Page 60: Django   a whirlwind tour

Want to Learn More?

• Official Django Docs

• https://docs.djangoproject.com

• *Djangobook http://www.djangobook.com

• Find Apps: http://www.djangopackages.com/

• Coming Soon: http://gettingstartedwithdjango.com/

Friday, November 2, 12

Page 61: Django   a whirlwind tour

Q.E.D.

Friday, November 2, 12