Prêt	
  pour	
  un	
  ciné	
  ?	
  
Django	
  

       Du	
  framework	
  	
  
pour	
  les	
  perfec9onnistes	
  	
  
   au	
  pony	
  powered	
  
Un	
  peu	
  de	
  philo	
  
•  En	
  Python	
  
Un	
  peu	
  de	
  philo	
  
•  En	
  Python	
  
•  Full	
   stack	
   ==	
   baBeries	
   included	
   (ORM,	
   rou9ng,	
  
   auth,	
  i18n,	
  templates,	
  etc.)	
  
Un	
  peu	
  de	
  philo	
  
•  En	
  Python	
  
•  Full	
   stack	
   ==	
   baBeries	
   included	
   (ORM,	
   rou9ng,	
  
   auth,	
  i18n,	
  templates,	
  etc.)	
  
•  Issu	
  du	
  monde	
  du	
  journalisme,	
  d'où	
  le	
  slogan	
  :	
  
    Le	
   framework	
   pour	
   les	
   perfec0onnistes	
   avec	
   des	
  
    deadlines.	
  
Les	
  grandes	
  fonc9onnalités	
  
                    Contrat	
  de	
  base	
  




“Get	
  an	
  H:pRequest,	
  return	
  an	
  H:pResponse”	
  
Les	
  grandes	
  fonc9onnalités	
  
                         ORM	
  

•  Ac9ve	
  Record	
  
Les	
  grandes	
  fonc9onnalités	
  
                             ORM	
  

•  Ac9ve	
  Record	
  
•  Syntaxe	
  déclara9ve	
  en	
  Python	
  
Les	
  grandes	
  fonc9onnalités	
  
                                  ORM	
  
#	
  project/books/models.py	
  
from	
  django.contrib.auth.models	
  import	
  User	
  
from	
  django.db	
  import	
  models	
  
   	
  	
  
class	
  Book(models.Model):	
  
   	
  author	
  =	
  models.ForeignKey(User)	
  
   	
  9tle	
  =	
  models.CharField(max_length=200)	
  
   	
  excerpt	
  =	
  models.CharField(required=False,	
  max_length=500)	
  
   	
  published_at	
  =	
  models.DateField(required=False)	
  
   	
  available	
  =	
  models.BooleanField(default=True) 	
  	
  
Les	
  grandes	
  fonc9onnalités	
  
                                        ORM	
  

•  Tout	
  récupérer	
  :	
  
    Book.objects.all()	
  
•  Compter	
  :	
  
	
  	
  	
  	
  User.objects.count()	
  
•  Récupérer	
  un	
  objet	
  :	
  
	
  	
  	
  	
  User.objects.get(pk=1)	
  
	
  	
  	
  	
  User.objects.get(email=user@domain.com)	
  
	
  	
  	
  	
  User.objects.get(first_name=Chuck,	
  last_name=Norris)	
  
Les	
  grandes	
  fonc9onnalités	
  
                                                                        ORM	
  

•  Filtrer	
  les	
  données	
  :	
  
   User.objects.filter(staff=True)	
  
   User.objects.filter(staff=True,	
  	
  	
  	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  email__icontains="domain.com")	
  
   User.objects.exclude(name__in=["foo",	
  "bar"])	
  
   User.objects.filter(staff=True,	
  	
   	
  	
  	
  	
  	
  	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  email__icontains="domain.com")	
  
   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .exclude(name__in=["foo",	
  "bar"])	
  
   User.objects.filter(profile__prefs__lang__in=["fr",	
  "en"])	
  
Les	
  grandes	
  fonc9onnalités	
  
                                                                                                        ORM	
  

•  Tri	
  :	
  
          User.objects.filter(staff=True).order_by("-­‐date_joined")	
  
•  Suivi	
  des	
  rela9ons	
  :	
  
	
  	
  	
  	
  	
  User.objects.select_related().filter(staff=True)	
  
	
  	
  	
  	
  	
  User.objects.select_related(depth=1).filter(staff=True)	
  
	
  	
  	
  	
  	
  User.objects.select_related("profile",	
  "profile__prefs")	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .filter(staff=True)	
  
Les	
  grandes	
  fonc9onnalités	
  
                                                    ORM	
  

•  On	
  manipule	
  vraiment	
  des	
  objets	
  Python	
  :	
  
   -­‐	
  Récupérer	
  les	
  3	
  premiers	
  :	
  
   	
  	
  	
  	
  	
  	
  	
  	
  User.objects.all()[:3]	
  
Les	
  grandes	
  fonc9onnalités	
  
                               Les	
  formulaires	
  

•  Interagit	
  avec	
  les	
  modèles	
  :	
  	
  	
  	
  
	
  	
  	
  	
  #	
  project/books/forms.py	
  
	
  	
  	
  	
  from	
  django	
  import	
  forms	
  
	
  	
  	
  	
  from	
  models	
  import	
  Book	
  
	
  
	
  	
  	
  	
  class	
  BookForm	
  (forms.ModelForm):	
  
	
  	
  	
  	
  	
  	
  	
  	
  class	
  Meta:	
  
                   	
   	
   	
  model	
  =	
  Book	
  
Les	
  grandes	
  fonc9onnalités	
  
                                           Les	
  formulaires	
  
	
  	
  	
  	
  #	
  project/books/views.py	
  
	
  	
  	
  	
  from	
  django.shortcuts	
  import	
  render_to_response	
  
	
  	
  	
  	
  from	
  forms	
  import	
  BookForm	
  
	
  

	
  	
  	
  	
  def	
  add_book(request):	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  request.method	
  ==	
  "POST":	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  form	
  =	
  BookForm(request.POST)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  form.is_valid():	
  form.save()	
  
	
  	
  	
  	
  	
  	
  	
  	
  else:	
  form	
  =	
  BookForm()	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  render_to_response("books/add.html",	
  
                    	
   	
   	
   	
   	
   	
   	
   	
   	
  	
  	
  	
  {"form":	
  form})	
  
Les	
  grandes	
  fonc9onnalités	
  
                              Les	
  templates	
  
•  Pour	
  les	
  designers	
  :	
  
    – 	
  Simple	
  (rend	
  impossible	
  de	
  faire	
  du	
  modèle	
  
      dans	
  un	
  template	
  ≠	
  PHP)	
  
    – Secure	
  par	
  défaut	
  (échappement	
  pour	
  les	
  XSS,	
  
      gère	
  silencieusement	
  les	
  valeurs	
  absentes)	
  
    – Extensible	
  
Les	
  grandes	
  fonc9onnalités	
  
                                           Les	
  templates	
  
<h1>{{	
  book	
  }}</h1>	
  
<h2>Author	
  {{	
  book.author	
  }}</h2>	
  
{%	
  if	
  book.chapters.count	
  %}	
  
	
   	
  <ul>{%	
  for	
  chapter	
  in	
  book.chapters.all	
  %}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <li>	
  
                       	
   	
  <a	
  href="{%	
  url	
  chapter_view	
  book.slug	
  %}”>{{	
  chapter	
  }}</a>	
  
                       	
   	
  </li>	
  {%	
  endfor	
  %}	
  
	
  	
  	
  	
  	
  	
  	
  	
  </ul>	
  
{%	
  else	
  %}	
  
                       	
  <p>{%	
  trans	
  “This	
  book	
  hasn’t	
  chapters	
  yet	
  %}</p>	
  
{%	
  endif	
  %}	
  
Les	
  atouts	
  
                              L’admin	
  
•  Ze	
  killer	
  feature	
  
•  	
  >>	
  admin	
  symfony	
  pourtant	
  déjà	
  top	
  
Les	
  atouts	
  
                        Reusable	
  apps	
  

•  Un	
  énorme	
  écosystème	
  d'apps	
  réu9lisables	
  
   (comme	
  drupal	
  ou	
  Wordpress,	
  la	
  qualité	
  en	
  
   plus	
  :p)	
  
•  djangopackages.com,	
  Pypi,	
  github,	
  etc.	
  
Les	
  atouts	
  
                          It's	
  just	
  Python	
  

•  Python	
  a	
  une	
  Standard	
  lib	
  très	
  vaste,	
  bien	
  
   structurée	
  et	
  de	
  très	
  bonne	
  qualité.	
  
•  PyPi	
  complète	
  encore	
  au	
  besoin.	
  
Les	
  atouts	
  
                                         It's	
  just	
  Python	
  

•  N'importe	
  quel	
  module/package	
  Python	
  peut	
  être	
  
   u9lisé	
  :	
  

	
  	
  	
  	
  >>>	
  from	
  __future__	
  import	
  braces	
  
	
  	
  	
  	
  	
  	
  File	
  "<stdin>",	
  line	
  1	
  
	
  	
  	
  	
  SyntaxError:	
  not	
  a	
  chance	
  
	
  	
  	
  	
  >>>	
  	
  

	
  	
  	
  	
  ou	
  presque	
  !	
  
Les	
  atouts	
  
                                                                                        Concevez	
  des	
  infras	
  

•  Ne	
  faites	
  plus	
  des	
  pages	
  
•  Ne	
  faites	
  plus	
  des	
  apps	
  
•  Faites	
  des	
  infras	
  

•  PaBern	
  "Loose	
  coupling,	
  0ght	
  cohesion."	
  	
  

                    "Languages,	
  libraries	
  and	
  frameworks	
  don't	
  scale,	
  
                                       architectures	
  do."	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  —	
  Cal	
  Henderson	
  
Les	
  points	
  faibles	
  
     Moins	
  connu	
  que	
  Symfony	
  ou	
  même	
  RoR	
  

•  Pas	
  énormément	
  de	
  ressources	
  en	
  France	
  
   (mais	
  un	
  pe9t	
  groupe	
  bien	
  sympathique)	
  
Les	
  points	
  faibles	
  
                              NodeJS	
  

•  Async	
  en	
  possible	
  en	
  Python	
  (gevent,	
  
   Tornado,	
  Twisted)	
  
•  Mais	
  du	
  coup,	
  pas	
  django	
  
•  Redis	
  is	
  your	
  friend	
  
Développement	
  
•  Un	
  serveur	
  web	
  intégré	
  +	
  SQLite	
  
   ./manage.py	
  syncdb	
  
   ./manage.py	
  runserver	
  
•  Pour	
  les	
  migra9ons	
  :	
  South	
  
•  Pour	
  contrôler	
  ce	
  qui	
  se	
  passe	
  pendant	
  une	
  
     requête:	
  django-­‐debug-­‐toolbar	
  
	
  
Déploiement	
  
•  Un	
  peu	
  plus	
  compliqué	
  que	
  PHP	
  
•  Des	
  hébergeurs	
  spécialisés	
  :	
  
    –  Alwaysdata	
  (FR)	
  
    –  Heroku	
  (US)	
  
•  Setup	
  typique	
  :	
  
    –  nginx	
  (sta9cs	
  JS/CSS)	
  
    –  gunicorn	
  (serveur	
  applica9f)	
  
    –  Postgres	
  
Qui	
  l'u9lise	
  
•  Issu	
  du	
  monde	
  du	
  journalisme	
  :	
  Lawrence	
  
   World,	
  NYT	
  
•  Google	
  (GAE	
  a	
  d'abord	
  été	
  dispo	
  en	
  Python	
  
   avec	
  un	
  django	
  modifié	
  pour	
  u9liser	
  BigTable)	
  
•  Mozilla	
  (le	
  site	
  addons)	
  
•  Nasa	
  
•  Startups:	
  Instagram,	
  Pinterest,	
  Disqus,	
  
   Bitbucket,	
  eventbrite	
  
En	
  France	
  

•    Libé,	
  20	
  minutes	
  
•    Autolib	
  
•    Century	
  21	
  
•    Alwaysdata	
  (hébergement)	
  
•    Startups	
  :	
  Greenbureau,	
  Novapost	
  
•    CRM	
  :	
  Creme	
  CRM	
  
Trouver	
  de	
  l'info	
  et	
  du	
  support	
  
•  En	
  Français	
  :	
  
    –  Channel	
  IRC	
  #django-­‐fr	
  irc.freenode.net	
  
    –  django-­‐fr	
  (ML	
  et	
  forum)	
  www.django-­‐fr.org	
  	
  
    –  Tutos	
  hBp://tutos-­‐django.com	
  	
  
    –  les	
  djangocongs	
  hBp://rencontres.django-­‐fr.org	
  	
  
Remerciements	
  
@revolunet	
  pour	
  django	
  success	
  stories	
  	
  
   hBp://www.revolunet.com/sta9c/django-­‐success-­‐
   stories	
  	
  
Pour	
  finir	
  
•  @nau9lebleu	
  /	
  hBp://nau9lebleu.tumblr.com	
  	
  

•  @greenbureaufr	
  /	
  hBp://greenbureau.fr	
  
   –  Stages	
  &	
  jobs	
  
        hBp://remixjobs.com/emploi/Developpement/
        Developpeur-­‐Integrateur-­‐Front-­‐End-­‐Django-­‐H-­‐F/
        15980	
  
   	
  

Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony powered par Goulwen Reboux

  • 1.
    Prêt  pour  un  ciné  ?  
  • 2.
    Django   Du  framework     pour  les  perfec9onnistes     au  pony  powered  
  • 3.
    Un  peu  de  philo   •  En  Python  
  • 4.
    Un  peu  de  philo   •  En  Python   •  Full   stack   ==   baBeries   included   (ORM,   rou9ng,   auth,  i18n,  templates,  etc.)  
  • 5.
    Un  peu  de  philo   •  En  Python   •  Full   stack   ==   baBeries   included   (ORM,   rou9ng,   auth,  i18n,  templates,  etc.)   •  Issu  du  monde  du  journalisme,  d'où  le  slogan  :   Le   framework   pour   les   perfec0onnistes   avec   des   deadlines.  
  • 6.
    Les  grandes  fonc9onnalités   Contrat  de  base   “Get  an  H:pRequest,  return  an  H:pResponse”  
  • 7.
    Les  grandes  fonc9onnalités   ORM   •  Ac9ve  Record  
  • 8.
    Les  grandes  fonc9onnalités   ORM   •  Ac9ve  Record   •  Syntaxe  déclara9ve  en  Python  
  • 9.
    Les  grandes  fonc9onnalités   ORM   #  project/books/models.py   from  django.contrib.auth.models  import  User   from  django.db  import  models       class  Book(models.Model):    author  =  models.ForeignKey(User)    9tle  =  models.CharField(max_length=200)    excerpt  =  models.CharField(required=False,  max_length=500)    published_at  =  models.DateField(required=False)    available  =  models.BooleanField(default=True)    
  • 10.
    Les  grandes  fonc9onnalités   ORM   •  Tout  récupérer  :   Book.objects.all()   •  Compter  :          User.objects.count()   •  Récupérer  un  objet  :          User.objects.get(pk=1)          User.objects.get(email=user@domain.com)          User.objects.get(first_name=Chuck,  last_name=Norris)  
  • 11.
    Les  grandes  fonc9onnalités   ORM   •  Filtrer  les  données  :   User.objects.filter(staff=True)   User.objects.filter(staff=True,                                                                          email__icontains="domain.com")   User.objects.exclude(name__in=["foo",  "bar"])   User.objects.filter(staff=True,                                                                                  email__icontains="domain.com")                                              .exclude(name__in=["foo",  "bar"])   User.objects.filter(profile__prefs__lang__in=["fr",  "en"])  
  • 12.
    Les  grandes  fonc9onnalités   ORM   •  Tri  :   User.objects.filter(staff=True).order_by("-­‐date_joined")   •  Suivi  des  rela9ons  :            User.objects.select_related().filter(staff=True)            User.objects.select_related(depth=1).filter(staff=True)            User.objects.select_related("profile",  "profile__prefs")                                                        .filter(staff=True)  
  • 13.
    Les  grandes  fonc9onnalités   ORM   •  On  manipule  vraiment  des  objets  Python  :   -­‐  Récupérer  les  3  premiers  :                  User.objects.all()[:3]  
  • 14.
    Les  grandes  fonc9onnalités   Les  formulaires   •  Interagit  avec  les  modèles  :                #  project/books/forms.py          from  django  import  forms          from  models  import  Book            class  BookForm  (forms.ModelForm):                  class  Meta:        model  =  Book  
  • 15.
    Les  grandes  fonc9onnalités   Les  formulaires          #  project/books/views.py          from  django.shortcuts  import  render_to_response          from  forms  import  BookForm            def  add_book(request):                  if  request.method  ==  "POST":                          form  =  BookForm(request.POST)                          if  form.is_valid():  form.save()                  else:  form  =  BookForm()                  return  render_to_response("books/add.html",                          {"form":  form})  
  • 16.
    Les  grandes  fonc9onnalités   Les  templates   •  Pour  les  designers  :   –   Simple  (rend  impossible  de  faire  du  modèle   dans  un  template  ≠  PHP)   – Secure  par  défaut  (échappement  pour  les  XSS,   gère  silencieusement  les  valeurs  absentes)   – Extensible  
  • 17.
    Les  grandes  fonc9onnalités   Les  templates   <h1>{{  book  }}</h1>   <h2>Author  {{  book.author  }}</h2>   {%  if  book.chapters.count  %}      <ul>{%  for  chapter  in  book.chapters.all  %}                          <li>      <a  href="{%  url  chapter_view  book.slug  %}”>{{  chapter  }}</a>      </li>  {%  endfor  %}                  </ul>   {%  else  %}    <p>{%  trans  “This  book  hasn’t  chapters  yet  %}</p>   {%  endif  %}  
  • 18.
    Les  atouts   L’admin   •  Ze  killer  feature   •   >>  admin  symfony  pourtant  déjà  top  
  • 19.
    Les  atouts   Reusable  apps   •  Un  énorme  écosystème  d'apps  réu9lisables   (comme  drupal  ou  Wordpress,  la  qualité  en   plus  :p)   •  djangopackages.com,  Pypi,  github,  etc.  
  • 20.
    Les  atouts   It's  just  Python   •  Python  a  une  Standard  lib  très  vaste,  bien   structurée  et  de  très  bonne  qualité.   •  PyPi  complète  encore  au  besoin.  
  • 21.
    Les  atouts   It's  just  Python   •  N'importe  quel  module/package  Python  peut  être   u9lisé  :          >>>  from  __future__  import  braces              File  "<stdin>",  line  1          SyntaxError:  not  a  chance          >>>            ou  presque  !  
  • 22.
    Les  atouts   Concevez  des  infras   •  Ne  faites  plus  des  pages   •  Ne  faites  plus  des  apps   •  Faites  des  infras   •  PaBern  "Loose  coupling,  0ght  cohesion."     "Languages,  libraries  and  frameworks  don't  scale,   architectures  do."                                                                                                                          —  Cal  Henderson  
  • 23.
    Les  points  faibles   Moins  connu  que  Symfony  ou  même  RoR   •  Pas  énormément  de  ressources  en  France   (mais  un  pe9t  groupe  bien  sympathique)  
  • 24.
    Les  points  faibles   NodeJS   •  Async  en  possible  en  Python  (gevent,   Tornado,  Twisted)   •  Mais  du  coup,  pas  django   •  Redis  is  your  friend  
  • 25.
    Développement   •  Un  serveur  web  intégré  +  SQLite   ./manage.py  syncdb   ./manage.py  runserver   •  Pour  les  migra9ons  :  South   •  Pour  contrôler  ce  qui  se  passe  pendant  une   requête:  django-­‐debug-­‐toolbar    
  • 26.
    Déploiement   •  Un  peu  plus  compliqué  que  PHP   •  Des  hébergeurs  spécialisés  :   –  Alwaysdata  (FR)   –  Heroku  (US)   •  Setup  typique  :   –  nginx  (sta9cs  JS/CSS)   –  gunicorn  (serveur  applica9f)   –  Postgres  
  • 27.
    Qui  l'u9lise   • Issu  du  monde  du  journalisme  :  Lawrence   World,  NYT   •  Google  (GAE  a  d'abord  été  dispo  en  Python   avec  un  django  modifié  pour  u9liser  BigTable)   •  Mozilla  (le  site  addons)   •  Nasa   •  Startups:  Instagram,  Pinterest,  Disqus,   Bitbucket,  eventbrite  
  • 28.
    En  France   •  Libé,  20  minutes   •  Autolib   •  Century  21   •  Alwaysdata  (hébergement)   •  Startups  :  Greenbureau,  Novapost   •  CRM  :  Creme  CRM  
  • 29.
    Trouver  de  l'info  et  du  support   •  En  Français  :   –  Channel  IRC  #django-­‐fr  irc.freenode.net   –  django-­‐fr  (ML  et  forum)  www.django-­‐fr.org     –  Tutos  hBp://tutos-­‐django.com     –  les  djangocongs  hBp://rencontres.django-­‐fr.org    
  • 30.
    Remerciements   @revolunet  pour  django  success  stories     hBp://www.revolunet.com/sta9c/django-­‐success-­‐ stories    
  • 31.
    Pour  finir   • @nau9lebleu  /  hBp://nau9lebleu.tumblr.com     •  @greenbureaufr  /  hBp://greenbureau.fr   –  Stages  &  jobs   hBp://remixjobs.com/emploi/Developpement/ Developpeur-­‐Integrateur-­‐Front-­‐End-­‐Django-­‐H-­‐F/ 15980