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

Django a whirlwind tour

Dec 15, 2014

Download

Technology

Brad Montgomery

A quick introduction to Django with tips on deploying to Heroku. Presented at TechCamp Memphis, Fall 2012
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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