Introduction à Django

Post on 03-Jun-2015

949 views 5 download

description

Introduction à Django présentée à Confoo 2013.

Transcript of Introduction à Django

Introduction à DjangoLa plateforme de développement web pour

les perfectionnistes avec des livrables.

présenté par

jeudi 28 février 13

BENOITDOMINGUE

@bedingue

Copyright Reptiletech 2013jeudi 28 février 13

jeudi 28 février 13

jeudi 28 février 13

jeudi 28 février 13

jeudi 28 février 13

jeudi 28 février 13

jeudi 28 février 13

22 OCTOBRE 2012 > REPTILETECH CONFIDENTIELLECopyright Reptiletech 2013

C’est quoi Django ? Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

source : https://www.djangoproject.com/jeudi 28 février 13

Copyright Reptiletech 2013

Python•Existe depuis 1989•Langague dynamique et oritenté object•Syntaxe simple et élégante•Librarie standard complète

source : http://en.wikipedia.org/wiki/Python_(programming_language)jeudi 28 février 13

source : httphttp://xkcd.com/353/

import antigravity

jeudi 28 février 13

Qui utilise Django

Copyright Reptiletech 2013jeudi 28 février 13

ORM Simple et puissantParce qu’en 2013, on a pas besoin d’écrire du SQL

Console AdministrationPermet de se lier à la base de donnée facilement

Pourquoi choisir Django

Copyright Reptiletech 2013jeudi 28 février 13

Pourquoi choisir Django

Copyright Reptiletech 2013

Gabarits avec héritageL’héritage dans les templates simplifie le htmlInternationalisation + localisationOutils intégrés pour la traduction et la localisation

jeudi 28 février 13

Pourquoi choisir Django

Copyright Reptiletech 2013

Design d’URL simpleAucune limitation au niveau de la structure des URLCachePeut s’intégrer facilement avec memcached

jeudi 28 février 13

Pourquoi choisir Django

Copyright Reptiletech 2013

Robuste, Performant et SécuritaireTrois belles qualités pour une plateforme de développement web!

jeudi 28 février 13

ORMDites au revoir au SQL!

Copyright Reptiletech 2013jeudi 28 février 13

ORM

Copyright Reptiletech 2013

Exemple d’un modèle - Blog simpleclass Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField()

class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField()

class Entry(models.Model): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author)

source : https://docs.djangoproject.com/en/dev/topics/db/queries/

jeudi 28 février 13

ORM

Copyright Reptiletech 2013

Requêtes Simples

all_entries = Entry.objects.all()SELECT * FROM ...;

Entry.objects.get(headline="Man bites dog")SELECT ... WHERE headline = 'Man bites dog';

Entry.objects.get(headline__contains='Lennon')SELECT ... WHERE headline LIKE '%Lennon%';

source : https://docs.djangoproject.com/en/dev/topics/db/queries/

jeudi 28 février 13

ORM

Copyright Reptiletech 2013

Requêtes - suite

Entry.objects.filter(pub_date__year=2006)

Entry.objects.filter(blog__name__exact='Beatles Blog')

Blog.objects.filter(entry__headline__contains='Lennon')

Blog.objects.filter(entry__authors__name='John')

Blog.objects.filter(entry__authors__name__isnull=True)

source : https://docs.djangoproject.com/en/dev/topics/db/queries/

jeudi 28 février 13

ORM

Copyright Reptiletech 2013

Instance d’un modèle

entry = Entry.objects.get(id=1)blog = entry.blogentry_authors = entry.authors

blog_entries = blog.entries_set.all()author = Author.objects.get(email="bdomigue@reptiletech.com")author_entries = author.entry_set.all()

recent_author_entries = author.entry_set.filter(pub_date__year=2006)

source : https://docs.djangoproject.com/en/dev/topics/db/queries/

jeudi 28 février 13

AdminLe pouvoir le l’introspection

Copyright Reptiletech 2013jeudi 28 février 13

Admin

Copyright Reptiletech 2013

Console d’administrations simples

from django.contrib import adminfrom myproject.myapp.models import Author

class AuthorAdmin(admin.ModelAdmin): pass

admin.site.register(Author, AuthorAdmin)

source : https://docs.djangoproject.com/en/1.5/ref/contrib/admin/

jeudi 28 février 13

Admin

Copyright Reptiletech 2013

Console d’administration - options

class UserAdmin(ModelAdmin): list_filter = ('is_staff', 'is_superuser') list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff') search_fields = ('first_name', 'last_name', 'email')

source : https://docs.djangoproject.com/en/1.5/ref/contrib/admin/

jeudi 28 février 13

Admin

Copyright Reptiletech 2013

Console d’administration - options suite

source : https://docs.djangoproject.com/en/1.5/ref/contrib/admin/

• inlines

• fields

• fieldsets

• readonly_fields

• list_editable

• ordering

• form

• etc.

jeudi 28 février 13

TemplatesL’héritage au service du HTML

ré-utilisable

Copyright Reptiletech 2013jeudi 28 février 13

Templates

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/templates/

{{ une_variable }}{% un_tag %}

Templates - Syntaxe

jeudi 28 février 13

Templates - héritage

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/templates/

<!DOCTYPE html><html lang="en"><head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{% endblock %}</title></head><body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div></body></html>

Template de base

jeudi 28 février 13

Templates - héritage

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/templates/

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}{% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p>{% endfor %}{% endblock %}

Template qui profite de l’héritage

jeudi 28 février 13

Templates

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/templates/

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}<h1>{{ section.title }}</h1>

{% for story in story_list %}<h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a></h2><p>{{ story.tease|truncatewords:"100" }}</p>{% endfor %}{% endblock %}

Templates - Tags et filtres

jeudi 28 février 13

Templates

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/templates/

Templates - Pour aller plus loin...

Ajouter un filtreIl s’agit simplement d’une fonction

Ajouter un tagOn sous classe le tag et on peut faire n’importe quoi

jeudi 28 février 13

URLSGrâce aux expressions régulières,

tout est possible!

Copyright Reptiletech 2013jeudi 28 février 13

URLS

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.conf.urls import patterns

urlpatterns = patterns('', (r'^blog/$', 'blog.views.page'), (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'),)

# View (in blog/views.py)def page(request, num="1"): # Output the appropriate page of blog entries, according to num.

Exemple simple

jeudi 28 février 13

URLS

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.conf.urls import patterns

urlpatterns = patterns('', (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),)

Autre exemple

jeudi 28 février 13

URLS

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.conf.urls import patterns

urlpatterns = patterns('', (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),)

Dans les templates

{% extends "base.html" %}{% block content %} <a href="{% url 'news.views.month_archive' 2013 03 %}"> Lien vers les articles de mars 2013 </a>{% endblock %}

jeudi 28 février 13

URLS

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.conf.urls import patterns

urlpatterns = patterns('', url(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive', name="article_archive"),)

Dans les templates

{% extends "base.html" %}{% block content %} <a href="{% url 'article_archive' 2013 03 %}"> Lien vers les articles de mars 2013 </a>{% endblock %}

jeudi 28 février 13

URLS

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.conf.urls import patterns

urlpatterns = patterns('', url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive', name="article_archive"),)

Dans les templates

{% extends "base.html" %}{% block content %} <a href="{% url 'article_archive' month='03' year='2013' %}"> Lien vers les articles de mars 2013 </a>{% endblock %}

jeudi 28 février 13

ViewsC’est par là que ça se passe!

(dernier morceau du casse tête)

Copyright Reptiletech 2013jeudi 28 février 13

Views

Copyright Reptiletech 2013

Préparer les données - Faire les requêtes à la BDD - Valider les formulaires - Logique propre à l’applicationRenvoyer une réponse- Rediriger- Renvoyer un document html- etc.

source : https://docs.djangoproject.com/en/1.5/topics/http/views/

Deux responsabilités

jeudi 28 février 13

Views

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.shortcuts import get_object_or_404, render_to_response

def article_detail(request, slug): article = get_object_or_404(Article, slug=slug) return render_to_response('article/detail.html', {'article': article})

Exemple

jeudi 28 février 13

Views

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.shortcuts import get_object_or_404, render_to_response

def article_detail(request, slug): article = get_object_or_404(Article, slug=slug) return render_to_response('article/detail.html', {'article': article})

Exemple

{% extends "base.html" %}{% block content %} <a href="{% url 'article_detail' slug='mon-article' %}"> Lien vers mon article </a>{% endblock %}

urlpatterns = patterns('', (r'^articles/(?P<slug>[\w\-]+)/$', 'articles.views.article_detail'),)

jeudi 28 février 13

Views

Copyright Reptiletech 2013source : https://docs.djangoproject.com/en/1.5/topics/http/urls/

from django.contrib.auth.decorators import login_required

@login_requireddef article_detail(request, slug): article = get_object_or_404(Article, slug=slug) return render_to_response('article/detail.html', {'article': article})

Decorators

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)def article_detail(request): article = get_object_or_404(Article, slug=slug) return render_to_response('article/detail.html', {'article': article})

jeudi 28 février 13

Démo!

Copyright Reptiletech 2013jeudi 28 février 13

MERCI!

Copyright Reptiletech 2013jeudi 28 février 13