Slide 1

Slide 1 text

Django Webmardi - 03.04.2012 @brutasse

Slide 2

Slide 2 text

$ whoami

Slide 3

Slide 3 text

“Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design”

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Théorie

Slide 7

Slide 7 text

Real-world app: Cheese catalog Like / dislike cheeses Twitter authentication

Slide 8

Slide 8 text

$ pip install Django http://www.pip-installer.org

Slide 9

Slide 9 text

$ django-admin.py startproject webmardi webmardi/ ├── manage.py └── webmardi ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py

Slide 10

Slide 10 text

manage.py Project toolbox

Slide 11

Slide 11 text

$ python manage.py startpapp cheese cheese/ ├── __init__.py ├── models.py ├── tests.py └── views.py

Slide 12

Slide 12 text

Models ORM

Slide 13

Slide 13 text

from django.db import models from ..users.models import User class Cheese(models.Model): name = models.CharField(max_length=255) image = models.ImageField(upload_to='cheese') description = models.TextField() class Taste(models.Model): cheese = models.ForeignKey(Cheese, related_name='tastes') user = models.ForeignKey(User) like = models.BooleanField(default=True) class Meta: unique_together = ('cheese', 'user')

Slide 14

Slide 14 text

Admin Customizable edition interface

Slide 15

Slide 15 text

from django.contrib import admin from .models import Cheese, Taste class CheeseAdmin(admin.ModelAdmin): list_display = ('name', 'image') class TasteAdmin(admin.ModelAdmin): list_display = ('cheese', 'user', 'like') admin.site.register(Cheese, CheeseAdmin) admin.site.register(Taste, TasteAdmin)

Slide 16

Slide 16 text

Views Request handling

Slide 17

Slide 17 text

from django.template.response import TemplateResponse from .models import Cheese, Taste def cheese_list(request): context = { 'cheeses': Cheese.objects.all(), } return TemplateResponse(request, 'cheese_list.html', context)

Slide 18

Slide 18 text

URLs HTTP routing

Slide 19

Slide 19 text

from django.conf.urls import patterns, url from . import views urlpatterns = patterns('', url(r'^$', views.cheese_list, name='cheese_list'), url(r'^cheese/(?P\d+)/$', views.cheese_detail, name='cheese_detail'), url(r'^cheese/(?P\d+)/like/$', views.like_cheese, name='like_cheese'), url(r'^cheese/(?P\d+)/dislike/$', views.dislike_cheese, name='dislike_cheese'), url(r'^cheese/add/$', views.add_cheese, name='add_cheese'), )

Slide 20

Slide 20 text

Templates

Slide 21

Slide 21 text

{% block title %}{% endblock %} {% block content %}{% endblock %}

Slide 22

Slide 22 text

{% extends "base.html" %} {% load thumbnail markup %} {% block title %}Cheese types{% endblock %} {% block content %} {% for cheese in cheeses %}

{{ cheese.name }}

{{ cheese.description|markdown }} {% endfor %} {% endblock %}

Slide 23

Slide 23 text

Tests Untested code is by definition broken

Slide 24

Slide 24 text

from django.core.urlresolvers import reverse from django.test import TestCase class CheeseTest(TestCase): def test_home(self): url = reverse('cheese_list') response = self.client.get(url) self.assertContains(response, 'Cheese')

Slide 25

Slide 25 text

Forms Input validation / sanitization rendering

Slide 26

Slide 26 text

from django import forms from .models import Cheese class CheeseForm(forms.ModelForm): class Meta: model = Cheese

Slide 27

Slide 27 text

GIS Cryptographic signing Browser testing i18n Flash messages Atom/RSS Email Cache Storage Logging Unicode Comments

Slide 28

Slide 28 text

Search Error reporting HTML5 forms Database migrations CMS REST API Background tasks Debugging There's an app for that

Slide 29

Slide 29 text

Questions‽ Thanks @liip Code: https://github.com/brutasse/webmardi Slides: http://speakerdeck.com/u/brutasse