SlideShare una empresa de Scribd logo
1 de 44
Descargar para leer sin conexión
Introduction à Django
                La plateforme de développement web pour
                  les perfectionnistes avec des livrables.




                                  présenté par




jeudi 28 février 13
BENOIT
                      DOMINGUE
                        @bedingue



                                    Copyright Reptiletech 2013
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
jeudi 28 février 13
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/                 22 OCTOBRE 2012 > REPTILETECH Reptiletech 2013
                                                                            Copyright CONFIDENTIELLE
jeudi 28 février 13
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)   Copyright Reptiletech 2013
jeudi 28 février 13
import antigravity




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

jeudi 28 février 13
Qui utilise Django




                                           Copyright Reptiletech 2013
jeudi 28 février 13
Pourquoi choisir Django




         ORM Simple et puissant
         Parce qu’en 2013, on a pas besoin d’écrire du SQL
         Console Administration
         Permet de se lier à la base de donnée facilement




                                                     Copyright Reptiletech 2013
jeudi 28 février 13
Pourquoi choisir Django




           Gabarits avec héritage
           L’héritage dans les templates simplifie le html
           Internationalisation + localisation
           Outils intégrés pour la traduction et la localisation




                                                         Copyright Reptiletech 2013
jeudi 28 février 13
Pourquoi choisir Django




           Design d’URL simple
           Aucune limitation au niveau de la structure des URL
           Cache
           Peut s’intégrer facilement avec memcached




                                                       Copyright Reptiletech 2013
jeudi 28 février 13
Pourquoi choisir Django




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




                                                          Copyright Reptiletech 2013
jeudi 28 février 13
ORM
                      Dites au revoir au SQL!




                                                Copyright Reptiletech 2013
jeudi 28 février 13
ORM

      Exemple d’un modèle - Blog simple
                                    class 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/                     Copyright Reptiletech 2013
jeudi 28 février 13
ORM

      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/                     Copyright Reptiletech 2013
jeudi 28 février 13
ORM

      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/                   Copyright Reptiletech 2013
jeudi 28 février 13
ORM

      Instance d’un modèle


         entry = Entry.objects.get(id=1)
         blog = entry.blog
         entry_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/        Copyright Reptiletech 2013
jeudi 28 février 13
Admin
                      Le pouvoir le l’introspection




                                                      Copyright Reptiletech 2013
jeudi 28 février 13
Admin

      Console d’administrations simples


                                                  from django.contrib import admin
                                                  from 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/                             Copyright Reptiletech 2013
jeudi 28 février 13
Admin

      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/                 Copyright Reptiletech 2013
jeudi 28 février 13
Admin

      Console d’administration - options suite


                      • inlines                                     • list_editable
                      • fields                                       • ordering
                      • fieldsets                                    • form
                      • readonly_fields                              • etc.


source : https://docs.djangoproject.com/en/1.5/ref/contrib/admin/                     Copyright Reptiletech 2013
jeudi 28 février 13
Templates
                       L’héritage au service du HTML
                                ré-utilisable




                                                       Copyright Reptiletech 2013
jeudi 28 février 13
Templates
      Templates - Syntaxe



                                                                   {{ une_variable }}
                                                                    {% un_tag %}




source : https://docs.djangoproject.com/en/1.5/topics/templates/                        Copyright Reptiletech 2013
jeudi 28 février 13
Templates - héritage
      Template de base
                   <!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>
source : https://docs.djangoproject.com/en/1.5/topics/templates/             Copyright Reptiletech 2013
jeudi 28 février 13
Templates - héritage
      Template qui profite de l’héritage


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




source : https://docs.djangoproject.com/en/1.5/topics/templates/                            Copyright Reptiletech 2013
jeudi 28 février 13
Templates
      Templates - Tags et filtres
                                {% 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 %}




source : https://docs.djangoproject.com/en/1.5/topics/templates/                     Copyright Reptiletech 2013
jeudi 28 février 13
Templates
      Templates - Pour aller plus loin...


          Ajouter un filtre
          Il s’agit simplement d’une fonction
          Ajouter un tag
          On sous classe le tag et on peut faire n’importe quoi




source : https://docs.djangoproject.com/en/1.5/topics/templates/   Copyright Reptiletech 2013
jeudi 28 février 13
URLS
                      Grâce aux expressions régulières,
                              tout est possible!




                                                          Copyright Reptiletech 2013
jeudi 28 février 13
URLS
      Exemple simple

          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.




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/       Copyright Reptiletech 2013
jeudi 28 février 13
URLS
      Autre exemple


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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/       Copyright Reptiletech 2013
jeudi 28 février 13
URLS
      Dans les templates

          from django.conf.urls import patterns

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




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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/                Copyright Reptiletech 2013
jeudi 28 février 13
URLS
      Dans les templates
                                  from django.conf.urls import patterns

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


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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/                      Copyright Reptiletech 2013
jeudi 28 février 13
URLS
      Dans les templates

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


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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/                    Copyright Reptiletech 2013
jeudi 28 février 13
Views
                        C’est par là que ça se passe!
                      (dernier morceau du casse tête)




                                                        Copyright Reptiletech 2013
jeudi 28 février 13
Views
      Deux responsabilités

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


source : https://docs.djangoproject.com/en/1.5/topics/http/views/         Copyright Reptiletech 2013
jeudi 28 février 13
Views
      Exemple



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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/      Copyright Reptiletech 2013
jeudi 28 février 13
Views
      Exemple
          urlpatterns = patterns('',
              (r'^articles/(?P<slug>[w-]+)/$', 'articles.views.article_detail'),
          )

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

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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/              Copyright Reptiletech 2013
jeudi 28 février 13
Views
      Decorators

        from django.contrib.auth.decorators import login_required

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


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




source : https://docs.djangoproject.com/en/1.5/topics/http/urls/      Copyright Reptiletech 2013
jeudi 28 février 13
Démo!
                              Copyright Reptiletech 2013
jeudi 28 février 13
MERCI!
                               Copyright Reptiletech 2013
jeudi 28 février 13

Más contenido relacionado

Destacado

Memoria servicio juridico 2012
Memoria servicio juridico 2012Memoria servicio juridico 2012
Memoria servicio juridico 2012Muskizko Udala
 
Cvim chapter4-5-ken_hide
Cvim chapter4-5-ken_hideCvim chapter4-5-ken_hide
Cvim chapter4-5-ken_hidekenhide
 
12. soal soal suku banyak
12. soal soal suku banyak12. soal soal suku banyak
12. soal soal suku banyakArif AN
 
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]Muskizko Udala
 
D’art Design Gruppe Unternehmenspressemappe 2013
D’art Design Gruppe  Unternehmenspressemappe 2013D’art Design Gruppe  Unternehmenspressemappe 2013
D’art Design Gruppe Unternehmenspressemappe 2013fredsy
 
Novi wahyu w xii ips 2 23
Novi wahyu w   xii ips 2   23Novi wahyu w   xii ips 2   23
Novi wahyu w xii ips 2 23novviwahyu
 
Vriesia Glas Totaal
Vriesia Glas TotaalVriesia Glas Totaal
Vriesia Glas TotaalVriesia Glas
 
Few Words - Marek Čech, LCM february 2013
Few Words - Marek Čech, LCM february 2013Few Words - Marek Čech, LCM february 2013
Few Words - Marek Čech, LCM february 2013Marek Čech
 
Passo a passo sistema são luiz para clientes
Passo a passo sistema são luiz para clientesPasso a passo sistema são luiz para clientes
Passo a passo sistema são luiz para clientesCarlos Henrique Pires
 
Magazine photography
Magazine photographyMagazine photography
Magazine photographyMegan Prince
 
La velocidad es lo maximo
La velocidad es lo maximoLa velocidad es lo maximo
La velocidad es lo maximoRoberto Angan
 
Voadoras
VoadorasVoadoras
Voadoraspimo
 
Use case Engagor Day De Lijn - RCA
Use case Engagor Day De Lijn - RCA Use case Engagor Day De Lijn - RCA
Use case Engagor Day De Lijn - RCA Engagor
 

Destacado (20)

lkh iohoih
lkh iohoihlkh iohoih
lkh iohoih
 
Memoria servicio juridico 2012
Memoria servicio juridico 2012Memoria servicio juridico 2012
Memoria servicio juridico 2012
 
Cvim chapter4-5-ken_hide
Cvim chapter4-5-ken_hideCvim chapter4-5-ken_hide
Cvim chapter4-5-ken_hide
 
12. soal soal suku banyak
12. soal soal suku banyak12. soal soal suku banyak
12. soal soal suku banyak
 
Ppoint blog
Ppoint blogPpoint blog
Ppoint blog
 
Ery9w46
Ery9w46Ery9w46
Ery9w46
 
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]
Memoria soap ayto muskiz 2012 euskera [modo de compatibilidad]
 
D’art Design Gruppe Unternehmenspressemappe 2013
D’art Design Gruppe  Unternehmenspressemappe 2013D’art Design Gruppe  Unternehmenspressemappe 2013
D’art Design Gruppe Unternehmenspressemappe 2013
 
Welcome!!!
Welcome!!!Welcome!!!
Welcome!!!
 
Novi wahyu w xii ips 2 23
Novi wahyu w   xii ips 2   23Novi wahyu w   xii ips 2   23
Novi wahyu w xii ips 2 23
 
Vriesia Glas Totaal
Vriesia Glas TotaalVriesia Glas Totaal
Vriesia Glas Totaal
 
Few Words - Marek Čech, LCM february 2013
Few Words - Marek Čech, LCM february 2013Few Words - Marek Čech, LCM february 2013
Few Words - Marek Čech, LCM february 2013
 
Passo a passo sistema são luiz para clientes
Passo a passo sistema são luiz para clientesPasso a passo sistema são luiz para clientes
Passo a passo sistema são luiz para clientes
 
Magazine photography
Magazine photographyMagazine photography
Magazine photography
 
La velocidad es lo maximo
La velocidad es lo maximoLa velocidad es lo maximo
La velocidad es lo maximo
 
Key 08
Key 08Key 08
Key 08
 
Voadoras
VoadorasVoadoras
Voadoras
 
Catalogue pour clients
Catalogue pour clientsCatalogue pour clients
Catalogue pour clients
 
1.20 feb
1.20 feb1.20 feb
1.20 feb
 
Use case Engagor Day De Lijn - RCA
Use case Engagor Day De Lijn - RCA Use case Engagor Day De Lijn - RCA
Use case Engagor Day De Lijn - RCA
 

Similar a Introduction à Django

Draft - Developper Sur Elgg
Draft - Developper Sur ElggDraft - Developper Sur Elgg
Draft - Developper Sur ElggBrice Gaillard
 
Annotations pour les Geeks
Annotations pour les GeeksAnnotations pour les Geeks
Annotations pour les Geeksjviet
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratiqueFrederic Hardy
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
DevoxxFR 2013 - Arquillian
DevoxxFR 2013 - ArquillianDevoxxFR 2013 - Arquillian
DevoxxFR 2013 - ArquillianAlexis Hassler
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
De Legacy à Symfony
De Legacy à SymfonyDe Legacy à Symfony
De Legacy à SymfonyAlayaCare
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web5pidou
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
DevoxxFR 2013 - Le classpath n'est pas mort, mais presque
DevoxxFR 2013 - Le classpath n'est pas mort, mais presqueDevoxxFR 2013 - Le classpath n'est pas mort, mais presque
DevoxxFR 2013 - Le classpath n'est pas mort, mais presqueAlexis Hassler
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 

Similar a Introduction à Django (20)

Draft - Developper Sur Elgg
Draft - Developper Sur ElggDraft - Developper Sur Elgg
Draft - Developper Sur Elgg
 
Annotations pour les Geeks
Annotations pour les GeeksAnnotations pour les Geeks
Annotations pour les Geeks
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
PHP5 et Zend Framework
PHP5 et Zend FrameworkPHP5 et Zend Framework
PHP5 et Zend Framework
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Bonnes pratiques développement android
Bonnes pratiques développement androidBonnes pratiques développement android
Bonnes pratiques développement android
 
DevoxxFR 2013 - Arquillian
DevoxxFR 2013 - ArquillianDevoxxFR 2013 - Arquillian
DevoxxFR 2013 - Arquillian
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
De Legacy à Symfony
De Legacy à SymfonyDe Legacy à Symfony
De Legacy à Symfony
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
DevoxxFR 2013 - Le classpath n'est pas mort, mais presque
DevoxxFR 2013 - Le classpath n'est pas mort, mais presqueDevoxxFR 2013 - Le classpath n'est pas mort, mais presque
DevoxxFR 2013 - Le classpath n'est pas mort, mais presque
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 

Introduction à Django

  • 1. Introduction à Django La plateforme de développement web pour les perfectionnistes avec des livrables. présenté par jeudi 28 février 13
  • 2. BENOIT DOMINGUE @bedingue Copyright Reptiletech 2013 jeudi 28 février 13
  • 9. 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/ 22 OCTOBRE 2012 > REPTILETECH Reptiletech 2013 Copyright CONFIDENTIELLE jeudi 28 février 13
  • 10. 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) Copyright Reptiletech 2013 jeudi 28 février 13
  • 11. import antigravity source : httphttp://xkcd.com/353/ jeudi 28 février 13
  • 12. Qui utilise Django Copyright Reptiletech 2013 jeudi 28 février 13
  • 13. Pourquoi choisir Django ORM Simple et puissant Parce qu’en 2013, on a pas besoin d’écrire du SQL Console Administration Permet de se lier à la base de donnée facilement Copyright Reptiletech 2013 jeudi 28 février 13
  • 14. Pourquoi choisir Django Gabarits avec héritage L’héritage dans les templates simplifie le html Internationalisation + localisation Outils intégrés pour la traduction et la localisation Copyright Reptiletech 2013 jeudi 28 février 13
  • 15. Pourquoi choisir Django Design d’URL simple Aucune limitation au niveau de la structure des URL Cache Peut s’intégrer facilement avec memcached Copyright Reptiletech 2013 jeudi 28 février 13
  • 16. Pourquoi choisir Django Robuste, Performant et Sécuritaire Trois belles qualités pour une plateforme de développement web! Copyright Reptiletech 2013 jeudi 28 février 13
  • 17. ORM Dites au revoir au SQL! Copyright Reptiletech 2013 jeudi 28 février 13
  • 18. ORM Exemple d’un modèle - Blog simple class 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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 19. ORM 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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 20. ORM 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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 21. ORM Instance d’un modèle entry = Entry.objects.get(id=1) blog = entry.blog entry_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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 22. Admin Le pouvoir le l’introspection Copyright Reptiletech 2013 jeudi 28 février 13
  • 23. Admin Console d’administrations simples from django.contrib import admin from 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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 24. Admin 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/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 25. Admin Console d’administration - options suite • inlines • list_editable • fields • ordering • fieldsets • form • readonly_fields • etc. source : https://docs.djangoproject.com/en/1.5/ref/contrib/admin/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 26. Templates L’héritage au service du HTML ré-utilisable Copyright Reptiletech 2013 jeudi 28 février 13
  • 27. Templates Templates - Syntaxe {{ une_variable }} {% un_tag %} source : https://docs.djangoproject.com/en/1.5/topics/templates/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 28. Templates - héritage Template de base <!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> source : https://docs.djangoproject.com/en/1.5/topics/templates/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 29. Templates - héritage Template qui profite de l’héritage {% 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 %} source : https://docs.djangoproject.com/en/1.5/topics/templates/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 30. Templates Templates - Tags et filtres {% 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 %} source : https://docs.djangoproject.com/en/1.5/topics/templates/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 31. Templates Templates - Pour aller plus loin... Ajouter un filtre Il s’agit simplement d’une fonction Ajouter un tag On sous classe le tag et on peut faire n’importe quoi source : https://docs.djangoproject.com/en/1.5/topics/templates/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 32. URLS Grâce aux expressions régulières, tout est possible! Copyright Reptiletech 2013 jeudi 28 février 13
  • 33. URLS Exemple simple 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. source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 34. URLS Autre exemple 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'), ) source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 35. URLS Dans les templates from django.conf.urls import patterns urlpatterns = patterns('', (r'^articles/(d{4})/(d{2})/$', 'news.views.month_archive'), ) {% extends "base.html" %} {% block content %} <a href="{% url 'news.views.month_archive' 2013 03 %}"> Lien vers les articles de mars 2013 </a> {% endblock %} source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 36. URLS Dans les templates from django.conf.urls import patterns urlpatterns = patterns('', url(r'^articles/(d{4})/(d{2})/$', 'news.views.month_archive', name="article_archive"), ) {% extends "base.html" %} {% block content %} <a href="{% url 'article_archive' 2013 03 %}"> Lien vers les articles de mars 2013 </a> {% endblock %} source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 37. URLS Dans les templates 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"),) {% extends "base.html" %} {% block content %} <a href="{% url 'article_archive' month='03' year='2013' %}"> Lien vers les articles de mars 2013 </a> {% endblock %} source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 38. Views C’est par là que ça se passe! (dernier morceau du casse tête) Copyright Reptiletech 2013 jeudi 28 février 13
  • 39. Views Deux responsabilités Préparer les données - Faire les requêtes à la BDD - Valider les formulaires - Logique propre à l’application Renvoyer une réponse - Rediriger - Renvoyer un document html - etc. source : https://docs.djangoproject.com/en/1.5/topics/http/views/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 40. Views Exemple 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}) source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 41. Views Exemple urlpatterns = patterns('', (r'^articles/(?P<slug>[w-]+)/$', 'articles.views.article_detail'), ) {% extends "base.html" %} {% block content %} <a href="{% url 'article_detail' slug='mon-article' %}"> Lien vers mon article </a> {% endblock %} 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}) source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 42. Views Decorators from django.contrib.auth.decorators import login_required @login_required def article_detail(request, slug): article = get_object_or_404(Article, slug=slug) return render_to_response('article/detail.html', {'article': article}) 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}) source : https://docs.djangoproject.com/en/1.5/topics/http/urls/ Copyright Reptiletech 2013 jeudi 28 février 13
  • 43. Démo! Copyright Reptiletech 2013 jeudi 28 février 13
  • 44. MERCI! Copyright Reptiletech 2013 jeudi 28 février 13