django a whirlwind tour

Post on 15-Dec-2014

469 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Django: A Whirlwind Tour

Brad Montgomery

Email: brad@workforpie.comTwitter: bkmontgomery

Friday, November 2, 12

Django: Features

• Python

• ORM: Object-Relational Mapper

• MVC-inspired (MVT)

• Clean URLs

• Huge Community

• Worlds Best Documentation

Friday, November 2, 12

Batteries Includedaka: contrib apps

• admin

• auth

• comments

• gis

• syndication (atom/rss feeds)

• sitemaps

Friday, November 2, 12

https://djangoproject.com/

Friday, November 2, 12

Community

• 3rd-party, open source apps

• django-registration

• django-social-auth

• django-taggit

• django-gravatar2

• django-relationships

Friday, November 2, 12

http://djangopackages.com/

Friday, November 2, 12

So, who’s actually using Django?

Friday, November 2, 12

Disqus,Instagram,

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

Friday, November 2, 12

Projects & Apps

• Projects are a collection of applications

• Settings

• DB Connections

• installed apps

• Filesystem paths

• Command-line tool: manage.py

Friday, November 2, 12

Projects & Apps

$ django-admin.py \ startproject \ sampleproject

Friday, November 2, 12

Projects & Apps

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

Friday, November 2, 12

Projects & Apps

$ python manage.py \ startapp blog

Friday, November 2, 12

Projects & Apps

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

Friday, November 2, 12

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

syncdb

$ python manage.py syncdb

Friday, November 2, 12

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

URL Conf’s

• Tie it all together!

• Route HTTP requests to views

• May also capture values

Friday, November 2, 12

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

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

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

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

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

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

An HTTP Request

Friday, November 2, 12

An HTTP Request

Friday, November 2, 12

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

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

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

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

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

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

An HTTP Request

Friday, November 2, 12

Friday, November 2, 12

A Typical Stack

Linux

Friday, November 2, 12

A Typical Stack

Linux

PostgreSQL

Friday, November 2, 12

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

Friday, November 2, 12

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

nginx

Friday, November 2, 12

A Typical Stack

Linux

PostgreSQL

Gunicorn + Django

nginx

Varnish

Redis

RabbitMQ

Memcached

Friday, November 2, 12

Friday, November 2, 12

Enter: Heroku

• Deploy & Scale in the Cloud

• Provides on-demand App/DB servers

• The Heroku Toolbelt

• http://www.heroku.com/

Friday, November 2, 12

Deploying to Heroku

$ heroku create

Creating app-name... done, stack is cedarhttp://app-name.herokuapp.com/ | git@heroku.com:app-name.gitGit remote heroku added

Do a little bit of setup...

Friday, November 2, 12

Deploying to Heroku

$ git push heroku master

... lots of output ...

Friday, November 2, 12

Deploying to Heroku

$ heroku run python manage.py syncdb

... your typical syncdb output ...

Friday, November 2, 12

Deploying to Heroku

$ git push heroku master

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

Friday, November 2, 12

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

Q.E.D.

Friday, November 2, 12

top related