Transcript
Page 1: Large problems, Mostly Solved

Large ProblemsMostly Solved

Eric Holscherhttp://ericholscher.com

Djangocon 2010

Wednesday, September 8, 2010

Page 2: Large problems, Mostly Solved

What this talk isn’t

» In depth

» Overly technical

» Conclusive

Wednesday, September 8, 2010

Page 3: Large problems, Mostly Solved

What this talk is

» Providing current best-of-class solutions to common problems

» Identifying problems that aren’t currently solved well

Wednesday, September 8, 2010

Page 4: Large problems, Mostly Solved

Overview

» Patterns among good apps

» The problems that are mostly solved

» Unsolved Problems

Wednesday, September 8, 2010

Page 5: Large problems, Mostly Solved

A good application

Wednesday, September 8, 2010

Page 6: Large problems, Mostly Solved

Leverages previous knowledge/APIs

Wednesday, September 8, 2010

Page 7: Large problems, Mostly Solved

Easy Setup

Wednesday, September 8, 2010

Page 8: Large problems, Mostly Solved

Good upgrade path

Wednesday, September 8, 2010

Page 9: Large problems, Mostly Solved

Good documentation

Wednesday, September 8, 2010

Page 10: Large problems, Mostly Solved

Well Tested

Wednesday, September 8, 2010

Page 11: Large problems, Mostly Solved

Solves a real problem

Wednesday, September 8, 2010

Page 12: Large problems, Mostly Solved

Mostly Solved Problems

Wednesday, September 8, 2010

Page 13: Large problems, Mostly Solved

Search

Wednesday, September 8, 2010

Page 14: Large problems, Mostly Solved

Haystack

» 9782 lines of docs

» 8882 lines of tests

» http://haystacksearch.org/

» Written by Daniel Lindsley

Wednesday, September 8, 2010

Page 15: Large problems, Mostly Solved

Line counts

find . |egrep "rst|txt" |xargs wc -l |cut -c1-8 | awk '{s+=$1} END {print s}'

find . |egrep "py" |xargs wc -l |cut -c1-8 | awk '{s+=$1} END {print s}'

#FORE!

Wednesday, September 8, 2010

Page 16: Large problems, Mostly Solved

Setup» pip install django-haystack

» Add ‘haystack’ to Installed Apps

» Settings for siteconf and backend

» Create Search Site

» Create Search Indexes

» Add views

» Reindex

Wednesday, September 8, 2010

Page 17: Large problems, Mostly Solved

Upgrade Path

» Simple backend

» Whoosh

» Solr

Wednesday, September 8, 2010

Page 18: Large problems, Mostly Solved

Beautiful APIs

unfriendly_results = SearchQuerySet().exclude(content='hello').filter(content='world')

unfriendly_results.order_by('-pub_date')[:5]

Wednesday, September 8, 2010

Page 19: Large problems, Mostly Solved

Beautiful APIs

class NoteIndex(SearchIndex): text = CharField(document=True, use_template=True) author = CharField(model_attr='user') pub_date = DateTimeField(model_attr='pub_date')

def get_queryset(self): return Note.objects.filter(pub_date__lte=datetime.datetime.now())

Wednesday, September 8, 2010

Page 20: Large problems, Mostly Solved

Awesome Features

» Faceting

» Highlighting

» More Like This

» Easy Customization

Wednesday, September 8, 2010

Page 21: Large problems, Mostly Solved

Wednesday, September 8, 2010

Page 22: Large problems, Mostly Solved

Amazing full-text search

Wednesday, September 8, 2010

Page 23: Large problems, Mostly Solved

In an hour.

Wednesday, September 8, 2010

Page 24: Large problems, Mostly Solved

Documentation

Wednesday, September 8, 2010

Page 25: Large problems, Mostly Solved

Sphinx

» 16598 lines of docs

» 13272 lines of tests

» http://sphinx.pocoo.org/

» Written by Georg Brandl

Wednesday, September 8, 2010

Page 26: Large problems, Mostly Solved

Setup

» pip install Sphinx

» sphinx-quickstart

» Edit/Create Restructured Text files

» make html

Wednesday, September 8, 2010

Page 27: Large problems, Mostly Solved

Awesome features

» Uses ReStructuredText

» Easily generate PDFs

» Link between your own and other docs

» Themes

Wednesday, September 8, 2010

Page 28: Large problems, Mostly Solved

Shameless Self Promotion

» Use Read The Docs

» Host Sphinx docs, or create them there.

» http://rtfd.org

» http://media.readthedocs.org/django.pdf

Wednesday, September 8, 2010

Page 29: Large problems, Mostly Solved

Wednesday, September 8, 2010

Page 30: Large problems, Mostly Solved

Make Beautiful Documentation With Tools

You Know

Wednesday, September 8, 2010

Page 31: Large problems, Mostly Solved

Database Migrations

Wednesday, September 8, 2010

Page 32: Large problems, Mostly Solved

South

» 5662 lines of docs

» 4328 lines of tests

» http://south.aeracode.org/

» Written by Andrew Godwin

Wednesday, September 8, 2010

Page 33: Large problems, Mostly Solved

Setup

» pip install south

» south in Installed Apps

» manage.py schemamigration app --initial

» manage.py schemamigratoin app name --auto

» manage.py migrate

Wednesday, September 8, 2010

Page 34: Large problems, Mostly Solved

Beautiful API

def forwards(self, orm): for adopter in orm.Adopter.objects.all(): try: adopter.first_name, adopter.last_name = adopter.name.split() except ValueError: adopter.first_name, adopter.last_name = adopter.name, "" adopter.save()

Wednesday, September 8, 2010

Page 35: Large problems, Mostly Solved

Boring

Wednesday, September 8, 2010

Page 36: Large problems, Mostly Solved

Safe, Painless Data Migration

Wednesday, September 8, 2010

Page 37: Large problems, Mostly Solved

Delayed Execution

Wednesday, September 8, 2010

Page 38: Large problems, Mostly Solved

Run commands out of process

Wednesday, September 8, 2010

Page 39: Large problems, Mostly Solved

Celery

» 19610 lines of docs

» 13822 lines of tests

» http://celeryproject.org/

» Written by Ask Solem

Wednesday, September 8, 2010

Page 40: Large problems, Mostly Solved

Setup

» pip install django-celery

» Add ‘djcelery’ to Installed Apps

» Syncdb

» Configure your settings backend

» Add @task decorator to function

Wednesday, September 8, 2010

Page 41: Large problems, Mostly Solved

When and Why

» Makes your site fast

» Use for tasks that users don’t immediately care about

» Even if they do, return fast to a waiting page

Wednesday, September 8, 2010

Page 42: Large problems, Mostly Solved

Examples

» Activity

» Sending Email

» Complex DB queries

Wednesday, September 8, 2010

Page 43: Large problems, Mostly Solved

Wednesday, September 8, 2010

Page 44: Large problems, Mostly Solved

Path

» Start with ALWAYS_EAGER

» Use a ghetto queue

» Rabbit MQ

Wednesday, September 8, 2010

Page 45: Large problems, Mostly Solved

Awesome features

» Run on multiple machines

» Cron replacement

» Good error reporting

Wednesday, September 8, 2010

Page 46: Large problems, Mostly Solved

Magically make your code async

Wednesday, September 8, 2010

Page 47: Large problems, Mostly Solved

Remote Execution

Wednesday, September 8, 2010

Page 48: Large problems, Mostly Solved

Run commands on remote servers (for deployment)

Wednesday, September 8, 2010

Page 49: Large problems, Mostly Solved

Fabric

» 7272 lines of docs

» 4572 lines of tests

» http://fabfile.org

» Written by Christian Vest Hansen & Jeff Forcier

Wednesday, September 8, 2010

Page 50: Large problems, Mostly Solved

Setup

» pip install fabric

» Add commands to a fabfile.py

» fab <command>

Wednesday, September 8, 2010

Page 51: Large problems, Mostly Solved

Simple example

#Fabfilefrom fabric.api import run

def host_type(): run('uname -s')

# Command$ fab -H example.com host_type

Wednesday, September 8, 2010

Page 52: Large problems, Mostly Solved

Write python to deploy your code

Wednesday, September 8, 2010

Page 53: Large problems, Mostly Solved

Deployment

Wednesday, September 8, 2010

Page 54: Large problems, Mostly Solved

Gunicorn

» 1898 lines of docs

» 2172 lines of tests

» http://gunicorn.org/

» Created by Benoit Chesneau

Wednesday, September 8, 2010

Page 55: Large problems, Mostly Solved

Setup

» pip install gunicorn

» add gunicorn to your Installed Apps

» manage.py run_gunicorn

Wednesday, September 8, 2010

Page 56: Large problems, Mostly Solved

Need to install Nginx in front

Wednesday, September 8, 2010

Page 57: Large problems, Mostly Solved

Nginx setup

server { listen 80; server_name example.com; access_log /var/log/nginx/example.log;

location / { proxy_pass http://127.0.0.1:8080; }}

Wednesday, September 8, 2010

Page 58: Large problems, Mostly Solved

Awesome Features

» Async backend workers

» Simple configuration

» Python

Wednesday, September 8, 2010

Page 59: Large problems, Mostly Solved

Stupidly Simple, Production Ready

Deployment

Wednesday, September 8, 2010

Page 60: Large problems, Mostly Solved

Packaging

Wednesday, September 8, 2010

Page 61: Large problems, Mostly Solved

Pip & Virtualenv

» Written by Ian Bicking

» http://pip-installer.org

» http://virtualenv.openplans.org

Wednesday, September 8, 2010

Page 62: Large problems, Mostly Solved

Set up

» sudo easy_install pip # :D

» sudo pip install virtualenv

» virtualenv awesome_env

» source awesome_env/bin/activate

» pip install Django

Wednesday, September 8, 2010

Page 63: Large problems, Mostly Solved

Awesome Features

» Separate environments for each application or deployment

» Install code from repos

» Doesn’t use eggs

» User-owned environment

Wednesday, September 8, 2010

Page 64: Large problems, Mostly Solved

Adds community standards to something everyone was

doing their own way

Wednesday, September 8, 2010

Page 65: Large problems, Mostly Solved

No more PYTHONPATH hacking

Wednesday, September 8, 2010

Page 66: Large problems, Mostly Solved

Competing Applications

Wednesday, September 8, 2010

Page 67: Large problems, Mostly Solved

APIs

Wednesday, September 8, 2010

Page 68: Large problems, Mostly Solved

APIs

» TastyPie

» Piston

Wednesday, September 8, 2010

Page 69: Large problems, Mostly Solved

Tagging

Wednesday, September 8, 2010

Page 70: Large problems, Mostly Solved

Tagging

» Django Taggit *

» Django Tagging

Wednesday, September 8, 2010

Page 71: Large problems, Mostly Solved

Continuous Integration

Wednesday, September 8, 2010

Page 72: Large problems, Mostly Solved

Continuous Integration

» Hudson *

» Buildbot

Wednesday, September 8, 2010

Page 73: Large problems, Mostly Solved

Smaller Problems

Wednesday, September 8, 2010

Page 74: Large problems, Mostly Solved

Debugging in Development

Wednesday, September 8, 2010

Page 75: Large problems, Mostly Solved

django-debug-toolbar

» http://github.com/robhudson/django-debug-toolbar/

» Written by Rob Hudson

Wednesday, September 8, 2010

Page 76: Large problems, Mostly Solved

Wednesday, September 8, 2010

Page 77: Large problems, Mostly Solved

Profiles & Registration

Wednesday, September 8, 2010

Page 79: Large problems, Mostly Solved

Filtering

Wednesday, September 8, 2010

Page 80: Large problems, Mostly Solved

django-filter

» http://github.com/alex/django-filter

» Written by Alex Gaynor

Wednesday, September 8, 2010

Page 81: Large problems, Mostly Solved

Wednesday, September 8, 2010

Page 82: Large problems, Mostly Solved

Finding packages

Wednesday, September 8, 2010

Page 83: Large problems, Mostly Solved

Djangopackages.com

Wednesday, September 8, 2010

Page 84: Large problems, Mostly Solved

Unsolved Problems

Wednesday, September 8, 2010

Page 85: Large problems, Mostly Solved

Template Tags

Wednesday, September 8, 2010

Page 86: Large problems, Mostly Solved

Logging

Wednesday, September 8, 2010

Page 87: Large problems, Mostly Solved

Model Introspection

Wednesday, September 8, 2010

Page 88: Large problems, Mostly Solved

Class Based Views

Wednesday, September 8, 2010

Page 89: Large problems, Mostly Solved

Source code arrangement

Wednesday, September 8, 2010

Page 90: Large problems, Mostly Solved

Notifications/Email

Wednesday, September 8, 2010

Page 91: Large problems, Mostly Solved

Debugging in Production

Wednesday, September 8, 2010

Page 92: Large problems, Mostly Solved

OpenID/OAuth

Wednesday, September 8, 2010

Page 93: Large problems, Mostly Solved

VCS Abstraction

Wednesday, September 8, 2010

Page 94: Large problems, Mostly Solved

Positive Note

Wednesday, September 8, 2010

Page 95: Large problems, Mostly Solved

Cal’s list of problems ’08» Multiple Databases

» Multiple multi-keyed cache requests

» Slow HTTP requests while we're doing other stuff

» ORM creates dumb SQL

» Verbose template syntax

» No query debugger

» Ugly SQL syntax

» Commit all fields at once

» No mascot

» No deployment system

» Migrating ModelsWednesday, September 8, 2010

Page 96: Large problems, Mostly Solved

Cal’s list of problems ’08» Multiple Databases

» Multiple multi-keyed cache requests

» Slow HTTP requests while we're doing other stuff

» ORM creates dumb SQL

» Verbose template syntax

» No query debugger

» Ugly SQL syntax (Table aliases)

» Commit all fields at once

» No mascot

» No deployment system

» Extending modelsWednesday, September 8, 2010

Page 97: Large problems, Mostly Solved

Remember

» Leverage good applications in the community

» Take previous knowledge and apply it to new situations

» You can create an awesome application used by other people

Wednesday, September 8, 2010

Page 98: Large problems, Mostly Solved

Questions?

» [email protected]

» twitter.com/ericholscher

Wednesday, September 8, 2010