Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Django

Introduction to Django

Bruno Renié

April 03, 2012
Tweet

More Decks by Bruno Renié

Other Decks in Programming

Transcript

  1. Django
    Webmardi - 03.04.2012
    @brutasse

    View Slide

  2. $ whoami

    View Slide

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

    View Slide

  4. View Slide

  5. View Slide

  6. Théorie

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. manage.py
    Project toolbox

    View Slide

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

    View Slide

  12. Models
    ORM

    View Slide

  13. 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')

    View Slide

  14. Admin
    Customizable edition interface

    View Slide

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

    View Slide

  16. Views
    Request handling

    View Slide

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

    View Slide

  18. URLs
    HTTP routing

    View Slide

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

    View Slide

  20. Templates

    View Slide




  21. {% block title %}{% endblock %}


    {% block content %}{% endblock %}


    View Slide


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

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

    View Slide

  23. Tests
    Untested code is by definition broken

    View Slide

  24. 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')

    View Slide

  25. Forms
    Input validation / sanitization
    rendering

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide