Large problems, Mostly Solved

Preview:

Citation preview

Large ProblemsMostly Solved

Eric Holscherhttp://ericholscher.com

Djangocon 2010

Wednesday, September 8, 2010

What this talk isn’t

» In depth

» Overly technical

» Conclusive

Wednesday, September 8, 2010

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

Overview

» Patterns among good apps

» The problems that are mostly solved

» Unsolved Problems

Wednesday, September 8, 2010

A good application

Wednesday, September 8, 2010

Leverages previous knowledge/APIs

Wednesday, September 8, 2010

Easy Setup

Wednesday, September 8, 2010

Good upgrade path

Wednesday, September 8, 2010

Good documentation

Wednesday, September 8, 2010

Well Tested

Wednesday, September 8, 2010

Solves a real problem

Wednesday, September 8, 2010

Mostly Solved Problems

Wednesday, September 8, 2010

Search

Wednesday, September 8, 2010

Haystack

» 9782 lines of docs

» 8882 lines of tests

» http://haystacksearch.org/

» Written by Daniel Lindsley

Wednesday, September 8, 2010

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

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

Upgrade Path

» Simple backend

» Whoosh

» Solr

Wednesday, September 8, 2010

Beautiful APIs

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

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

Wednesday, September 8, 2010

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

Awesome Features

» Faceting

» Highlighting

» More Like This

» Easy Customization

Wednesday, September 8, 2010

Wednesday, September 8, 2010

Amazing full-text search

Wednesday, September 8, 2010

In an hour.

Wednesday, September 8, 2010

Documentation

Wednesday, September 8, 2010

Sphinx

» 16598 lines of docs

» 13272 lines of tests

» http://sphinx.pocoo.org/

» Written by Georg Brandl

Wednesday, September 8, 2010

Setup

» pip install Sphinx

» sphinx-quickstart

» Edit/Create Restructured Text files

» make html

Wednesday, September 8, 2010

Awesome features

» Uses ReStructuredText

» Easily generate PDFs

» Link between your own and other docs

» Themes

Wednesday, September 8, 2010

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

Wednesday, September 8, 2010

Make Beautiful Documentation With Tools

You Know

Wednesday, September 8, 2010

Database Migrations

Wednesday, September 8, 2010

South

» 5662 lines of docs

» 4328 lines of tests

» http://south.aeracode.org/

» Written by Andrew Godwin

Wednesday, September 8, 2010

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

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

Boring

Wednesday, September 8, 2010

Safe, Painless Data Migration

Wednesday, September 8, 2010

Delayed Execution

Wednesday, September 8, 2010

Run commands out of process

Wednesday, September 8, 2010

Celery

» 19610 lines of docs

» 13822 lines of tests

» http://celeryproject.org/

» Written by Ask Solem

Wednesday, September 8, 2010

Setup

» pip install django-celery

» Add ‘djcelery’ to Installed Apps

» Syncdb

» Configure your settings backend

» Add @task decorator to function

Wednesday, September 8, 2010

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

Examples

» Activity

» Sending Email

» Complex DB queries

Wednesday, September 8, 2010

Wednesday, September 8, 2010

Path

» Start with ALWAYS_EAGER

» Use a ghetto queue

» Rabbit MQ

Wednesday, September 8, 2010

Awesome features

» Run on multiple machines

» Cron replacement

» Good error reporting

Wednesday, September 8, 2010

Magically make your code async

Wednesday, September 8, 2010

Remote Execution

Wednesday, September 8, 2010

Run commands on remote servers (for deployment)

Wednesday, September 8, 2010

Fabric

» 7272 lines of docs

» 4572 lines of tests

» http://fabfile.org

» Written by Christian Vest Hansen & Jeff Forcier

Wednesday, September 8, 2010

Setup

» pip install fabric

» Add commands to a fabfile.py

» fab <command>

Wednesday, September 8, 2010

Simple example

#Fabfilefrom fabric.api import run

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

# Command$ fab -H example.com host_type

Wednesday, September 8, 2010

Write python to deploy your code

Wednesday, September 8, 2010

Deployment

Wednesday, September 8, 2010

Gunicorn

» 1898 lines of docs

» 2172 lines of tests

» http://gunicorn.org/

» Created by Benoit Chesneau

Wednesday, September 8, 2010

Setup

» pip install gunicorn

» add gunicorn to your Installed Apps

» manage.py run_gunicorn

Wednesday, September 8, 2010

Need to install Nginx in front

Wednesday, September 8, 2010

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

Awesome Features

» Async backend workers

» Simple configuration

» Python

Wednesday, September 8, 2010

Stupidly Simple, Production Ready

Deployment

Wednesday, September 8, 2010

Packaging

Wednesday, September 8, 2010

Pip & Virtualenv

» Written by Ian Bicking

» http://pip-installer.org

» http://virtualenv.openplans.org

Wednesday, September 8, 2010

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

Awesome Features

» Separate environments for each application or deployment

» Install code from repos

» Doesn’t use eggs

» User-owned environment

Wednesday, September 8, 2010

Adds community standards to something everyone was

doing their own way

Wednesday, September 8, 2010

No more PYTHONPATH hacking

Wednesday, September 8, 2010

Competing Applications

Wednesday, September 8, 2010

APIs

Wednesday, September 8, 2010

APIs

» TastyPie

» Piston

Wednesday, September 8, 2010

Tagging

Wednesday, September 8, 2010

Tagging

» Django Taggit *

» Django Tagging

Wednesday, September 8, 2010

Continuous Integration

Wednesday, September 8, 2010

Continuous Integration

» Hudson *

» Buildbot

Wednesday, September 8, 2010

Smaller Problems

Wednesday, September 8, 2010

Debugging in Development

Wednesday, September 8, 2010

django-debug-toolbar

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

» Written by Rob Hudson

Wednesday, September 8, 2010

Wednesday, September 8, 2010

Profiles & Registration

Wednesday, September 8, 2010

Filtering

Wednesday, September 8, 2010

django-filter

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

» Written by Alex Gaynor

Wednesday, September 8, 2010

Wednesday, September 8, 2010

Finding packages

Wednesday, September 8, 2010

Djangopackages.com

Wednesday, September 8, 2010

Unsolved Problems

Wednesday, September 8, 2010

Template Tags

Wednesday, September 8, 2010

Logging

Wednesday, September 8, 2010

Model Introspection

Wednesday, September 8, 2010

Class Based Views

Wednesday, September 8, 2010

Source code arrangement

Wednesday, September 8, 2010

Notifications/Email

Wednesday, September 8, 2010

Debugging in Production

Wednesday, September 8, 2010

OpenID/OAuth

Wednesday, September 8, 2010

VCS Abstraction

Wednesday, September 8, 2010

Positive Note

Wednesday, September 8, 2010

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

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

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

Questions?

» eric@ericholscher.com

» twitter.com/ericholscher

Wednesday, September 8, 2010