Download - Django introduction @ UGent
Django introduction
Kevin Van Wilder www.inuits.eu
Topics
• What is Django?
• Framework overview
• Getting started
Who uses Django?
• Openstack
• Disqus
• Firefox
• NASA
• Bitbucket
• The Onion
• New York Times
• Washington Post
• The Guardian
• Mercedes Benz
• National Geographic
• Discovery Channel
• Orange
• ...
What is Django?
• Not a CMS!
• Web application framework to create complex, dynamic and datadriven websites with emphasis on: – Loose coupling and tight cohesion
– Less code
– Quick development
– DRY
– Consistent
Features
• Admin interface (CRUD)
• Templating
• Form handling
• Internationalisation (i18n)
• Sessions, User management, role-based permissions.
• Object-Relational Mapping (ORM)
• Testing Framework
• Fantastic documentation
FRAMEWORK OVERVIEW
Project Structure
Site/Project
Application
Mo
del
s
Vie
ws
Tem
pla
tes
Application M
od
els
Vie
ws
Tem
pla
tes Se
ttin
gs
Url
s
Tem
pla
tes
Model, View, Template
• Model
– Abstracts data by defining classes for them and stores them in relational tables
• View
– Takes a browser request and generates what the user gets to see
• Template
– Defines how the user will see the view
Framework
URLConf
• URLs are matched via patterns and mapped View functions/classes that create the output.
urlpatterns = patterns('',
url(r'^$',
TipListView.as_view(),
name='tip-list'),
url(r'^tips/(?P<slug>[-\w]+)/$',
TipDetailView.as_view(),
name='tip-detail'),
)
Views
• Receives a request and generates a response • Interacts with:
– Models – Templates – Caching
• Mostly fits inside one of the following categories: – Show a list of objects – Show details of an object – Create/Update/Delete an object – Show objects by year, month, week, day...
Views (continued)
• Just rendering text:
– TemplateView
• If that doesn’t float your boat: Mixins
– SingleObjectMixin
– FormMixin
– ModelFormMixin
– ...
Overview
class PublisherBookList(ListView): template_name = 'books/books_by_publisher.html' def get_queryset(self): self.publisher = get_object_or_404(Publisher, name=self.args[0]) return Book.objects.filter(publisher=self.publisher)
urlpatterns = patterns('', url(r'^books/([\w-]+)/$', PublisherBookList.as_view(), name='author-detail'), )
Templates
{% extends "base_generic.html" %}
{% block title %}
{{ publisher.name }}
{% endblock %}
{% block content %}
<h1>{{ publisher.name }}</h1>
{% for book in object_list %}
<h2>
<a href="{{ book.get_absolute_url }}">
{{ book.title }}
</a>
</h2>
{% endfor %}
{% endblock %}
Models
• Abstract representation of data
• Database independent
• Object oriented (methods, inheritance, etc)
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: ordering = ["-name"] def __unicode__(self): return self.name class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField('Author') publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
Querying the ORM
Book.objects.get(title=“On the Origin of Species”)
SELECT * FROM books WHERE title = “On the Origin of species”;
Querying the ORM
Books.objects
.filter(genre=“drama”)
.order_by(“-publish_date”)
.annotate(author_count=Count(‘author’))
.only(“title”, “publish_date”, “genre”)
GETTING STARTED
Working on “Onderwijstips” # SETTING UP ENVIRONMENT
$ mkvirtualenv onderwijstips
# CHECKING OUT THE CODE
$ git clone [email protected]:Portaal/site-onderwijstips.git
$ cd site-onderwijstips
$ git checkout develop
# BUILDING
$ ln –s buildout_dev.cfg buildout.cfg
$ python bootstrap.py
$ bin/buildout –vv # uses private github projects, requires permissions
# STARTING DJANGO
$ bin/django migrate
$ bin/django runserver
Git Repository
• Git Flow (http://nvie.com/posts/a-successful-git-branching-model/)
– master
• Always tagged with a version
• To be deployed
– develop
• Next version currently in development
– release/1.x.x
• A release being prepared
• Merges into master with tag 1.x.x
How are we deploying?
• Configuration: – Apache2 + mod_wsgi
– MySQL
– Optimize only when necessary (varnish, memcache, ...)
• Jenkins pipeline – Perform a buildout
– Generate .deb file
– Upload to Infrastructure Package Repository
– Triggers a Puppet run
Onderwijstips
• Three applications – Tips (front-end for users) – Editors (back-end for tip author) – Migration (plomino importer)
• Features: – Haystack search indexing (django-haystack) – User authentication (django-cas) – MediaMosa Integration (django-mediamosa) – Tagging (django-taggit) – Ugent Theming (django-ugent)
• Buildout (Thx Bert!) • Monitoring via Sentry • Database schema migration management via South
DEMO TIME!