31
A Quick Overview

Django Overview

Embed Size (px)

DESCRIPTION

A brief overview on Django. Original presented at the Grand Rapids Python User Group.

Citation preview

Page 1: Django Overview

A Quick Overview

Page 2: Django Overview

A bit about me

• Programmer @ 5Q Communications

• Hack on Django mostly full-time

• Dozen+ sites in production

• Calvin grad

Page 3: Django Overview
Page 4: Django Overview

A bit about Django

• Named after Django Reinhart, jazz guitarist

• Python 2.3+ (Not 3.x yet, afiak)

• BSD license

• djangoproject.com

• Current release: 1.1

Page 5: Django Overview
Page 6: Django Overview

Who uses it?• NASA

• PBS

• NY Times

• LA Times

• National Geographic

• Discovery Channel

Page 7: Django Overview

Features

• Object-Relational Mapper

• MVC architecture

• Templating Language

• “Automatic” admins

• Elegant urls

• i18n/unicode support

• Cache framework

• Testing framework

• Great docs (650+ pages)

• Friendly community

Page 8: Django Overview

More Features

• Jython support

• Geospacial content (via GeoDjango)

• Built-in dev server

• Nice support for forms

• Built-in RSS/ATOM

• Built-in site maps

• Send emails easily

• “Signal” hooks

• Solid security emphasis

Page 9: Django Overview

Projects and Apps

ProjectApp

App

App

App

Templates & Assets

Live anywhere in your PYTHONPATH

Settings: database, email, caching, etc.

HTML, CSS, images, etc.

Page 10: Django Overview

Typical Project Layoutproject/

__init__.pysettings.pymanage.pyurls.pytemplates/static/staff_members/

__init__.pymodels.pyadmin.pyviews.pyurls.pytests.pytemplates/

Page 11: Django Overview

Typical App Workflow

1. Create app

2. Create models.py and admin.py

3. ‘python manage.py syncdb’

4. Create urls.py and views.py

Page 12: Django Overview

class StaffMember(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) title = models.CharField(blank=True, max_length=100) bio = models.TextField(blank=True) image = models.FileField(upload_to='bio_images', blank=True) email = models.EmailField() published = models.BooleanField()

staff_group = models.ForeignKey(StaffMemberGroup)

class StaffMemberGroup(models.Model): name = models.CharField(blank=True, max_length=100) order = models.IntegerField(blank=True, null=True)

Page 13: Django Overview

python manage.py syncdb

1. Create tables2. Create basic indexes3. Create intermediate tables for m2m relationships

Page 14: Django Overview

members = StaffMember.objects.all()

ordered_members = StaffMember.objects.all().order_by(‘last_name’)

published_members = StaffMember.objects.filter(published=True)

bob = StaffMember(first_name=”Bob”, last_name=”Smith”)

Page 15: Django Overview

groups = StaffMemberGroup.objects.all()

for group in groups:print group.name for member in group.staffmember_set.all():

print member.first_name

Page 16: Django Overview

class StaffMemberAdmin(admin.ModelAdmin): list_display = ('last_name', 'first_name', 'email', 'published') list_filter = ('published', 'staff_group') search_fields = ('first_name', 'last_name', 'bio', 'title', 'email') fieldsets = ( (None, { 'fields': (('first_name', 'last_name'), 'title', 'email', 'image', 'bio'), 'description': '', }), ('Options', { 'fields': ('published', 'staff_group'), }) )admin.site.register(StaffMember, StaffMemberAdmin)

Page 17: Django Overview
Page 18: Django Overview
Page 19: Django Overview
Page 20: Django Overview

urlpatterns = patterns('grpug.staff_members.views', url(r'^$', 'show_staff_members', name='staff-members'), )

urlpatterns = patterns('', (r'^staff_members/', include('grpug.staff_members.urls')), (r'^admin/doc/', include('django.contrib.admindocs.urls')), (r'^admin/(.*)', admin.site.root),)

project urls.py

staff_members app urls.py:

Page 21: Django Overview

def show_staff_members(request): groups = StaffMemberGroup.objects.all() return render_to_response( 'staff_member.html', {'groups': groups} )

Page 22: Django Overview

{% for group in groups %} <h2>{{group.name}}</h2> <ul> {% for member in group.staffmember_set.all %} <li> <h3>{{member.first_name}} {{member.last_name}}</h3> <p>{{member.bio}}</p> </li> {% endfor %} </ul>{% endfor %}

staff_member.html

Page 23: Django Overview

{% extends ‘base_site.html’ %}

{% block content %}{% for group in groups %} <h2>{{group.name}}</h2> <ul> {% for member in group.staffmember_set.all %} <li> <h3>{{member.first_name}} {{member.last_name}}</h3> <p>{{member.bio}}</p> </li> {% endfor %} </ul>{% endfor %}

{% endblock content %}

staff_member.html

Page 24: Django Overview

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

base_site.html

Page 25: Django Overview

Middleware

• process_request(self, request)

• process_view(self, request, view_func, view_args, view_kwargs)

• process_response(self, request, response)

• process_exception(self, request, exception)

Page 26: Django Overview

Testing Framework

• doctests

• unit tests

• helpful stuff: fixtures, email test, “client”

c = Client()response = c.post(‘/login’, user_dict)

Page 27: Django Overview

Some Warts

• No support for multiple databases

• Poor environment support (think rails)

• Template logic tags below average

• No built-in migrations

• Too big?

• REST/SOAP support lacking

• “Explicit” but still tightly coupled for some things

• No integrated deployment toolchain

• CMS extras lacking (wysiwyg, file browser...)

Page 28: Django Overview

Rest of the stack

• Databases

• SQLite

• MySQL

• Postgresql

• Oracle

• Deployment

• mod_python

• mod_wsgi

• fast cgi

Page 29: Django Overview

Tips

• virtualenv is your friend

• default settings.py is about 50% of what a production site ends up requiring

• local_settings.py

• Don’t be afraid of lots of apps

• ‘South’ is a solid migrations tool

Page 30: Django Overview

Docs, Books, People

• docs.djangoproject.com

• djangobook.com

• djangosnippets.com

• djangopeople.net

• djangosites.org

Page 31: Django Overview

Code Samples

• http://bitbucket.org/btol45/grpug-example/