25
Django introduction Kevin Van Wilder www.inuits.eu

Django introduction @ UGent

  • Upload
    kevinvw

  • View
    395

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Django introduction @ UGent

Django introduction

Kevin Van Wilder www.inuits.eu

Page 2: Django introduction @ UGent

Topics

• What is Django?

• Framework overview

• Getting started

Page 3: Django introduction @ UGent

Who uses Django?

• Pinterest

• Instagram

• Openstack

• Disqus

• Firefox

• NASA

• Bitbucket

• The Onion

• New York Times

• Washington Post

• The Guardian

• Mercedes Benz

• National Geographic

• Discovery Channel

• Orange

• ...

Page 4: Django introduction @ UGent

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

Page 5: Django introduction @ UGent

Features

• Admin interface (CRUD)

• Templating

• Form handling

• Internationalisation (i18n)

• Sessions, User management, role-based permissions.

• Object-Relational Mapping (ORM)

• Testing Framework

• Fantastic documentation

Page 6: Django introduction @ UGent

FRAMEWORK OVERVIEW

Page 7: Django introduction @ UGent

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

Page 8: Django introduction @ UGent

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

Page 9: Django introduction @ UGent

Framework

Page 10: Django introduction @ UGent

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'),

)

Page 11: Django introduction @ UGent

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...

Page 12: Django introduction @ UGent

Views (continued)

• Just rendering text:

– TemplateView

• If that doesn’t float your boat: Mixins

– SingleObjectMixin

– FormMixin

– ModelFormMixin

– ...

Page 13: Django introduction @ UGent

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'), )

Page 14: Django introduction @ UGent

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 %}

Page 15: Django introduction @ UGent

Models

• Abstract representation of data

• Database independent

• Object oriented (methods, inheritance, etc)

Page 16: Django introduction @ UGent

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()

Page 17: Django introduction @ UGent

Querying the ORM

Book.objects.get(title=“On the Origin of Species”)

SELECT * FROM books WHERE title = “On the Origin of species”;

Page 18: Django introduction @ UGent

Querying the ORM

Books.objects

.filter(genre=“drama”)

.order_by(“-publish_date”)

.annotate(author_count=Count(‘author’))

.only(“title”, “publish_date”, “genre”)

Page 19: Django introduction @ UGent

GETTING STARTED

Page 20: Django introduction @ UGent

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

Page 21: Django introduction @ UGent

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

Page 22: Django introduction @ UGent
Page 23: Django introduction @ UGent

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

Page 24: Django introduction @ UGent

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

Page 25: Django introduction @ UGent

DEMO TIME!