Presentation du Livre Django Avancé
Prochain SlideShare
Loading in...5
×

Vous aimez ? Partagez donc ce contenu avec votre réseau

Partager

Presentation du Livre Django Avancé

  • 2,148 vues
Uploaded on

The slides of the talk made at "La cantine" ...

The slides of the talk made at "La cantine"
(http://lacantine.org/) for the "Vous reprendrez bien un peu de django" (http://lacantine.org/events/vous-reprendrez-bien-un-peu-de-django) event.

Plus dans : Technologies
  • Full Name Full Name Comment goes here.
    Êtes-vous sûr de vouloir
    Votre message apparaîtra ici
    Be the first to comment
    Be the first to like this
No Downloads

Vues

Total des vues
2,148
Sur Slideshare
2,148
From Embeds
0
Nombre d'ajouts
0

Actions

Partages
Téléchargements
22
Commentaires
0
J'aime
0

Ajouts 0

No embeds

Signaler un contenu

Signalé comme inapproprié Signaler comme inapproprié
Signaler comme inapproprié

Indiquez la raison pour laquelle vous avez signalé cette présentation comme n'étant pas appropriée.

Annuler
    No notes for slide

Transcript

  • 1. [center] Django Avancé Yohann Gabory
  • 2. Présentation de l’auteur Yohann Gabory Webdevelopper Outscale Auteur chez Eyrolles Djangonaute depuis la version 0.95
  • 3. Présentation de l’auteur Collaboration Préface de Nicolas Ferrari, co-fondateur d’alwaysdata (https://www.alwaysdata.com/) Relecture de Thomas Petillon, consultant senior IT et expert python/django Éditions Eyrolles
  • 4. Pourquoi un livre en français ? Aider les nouveaux arrivants Le premier contact est plus facile en français Le succès d’un outil tient à sa documentation La documentation française n’est plus à jour depuis looooongtemps
  • 5. Pourquoi un livre en français ? Proposer de nouvelles choses Le framework a beaucoup évolué depuis les parutions anglophones C’est un framework de plus en plus largement utilisé Il est temps d’aller plus loin Les CBV Les “Reusable Apps” Les besoins ont changé API, Oauth etc. . .
  • 6. Pourquoi un livre en français ? “Apprendre la programmation web avec Python et Django” Un livre didactique pour les débutants Les base de la programmation web Les notions essentielles Mise en application avec Django
  • 7. Un avant-goût du contenu du livre Des tutoriels Un Bug Tracker Parce que les bonnes pratiques se prennent dès le départ Un Agenda Partagé Tremble Google Agenda, les poneys arrivent! Des exemples de “la vraie vie” Parce c’est au pied du mur. . . Une volonté d’aller au fond des choses
  • 8. Un avant-goût du contenu du livre Des bonnes pratiques Comment structurer ses modèles quels type d’héritage utiliser où mettre la logique de votre application Le principe du DRY : partout Dans les urls, les modèles, les vues, les templates. Un seul endroit oui mais clairement identifiable: surtout! Découplez! Identifiez les usages Une application == une fonctionalité Écrivez “plug’n play” Les bonnes façons de résoudre les problèmes
  • 9. Un avant-goût du contenu du livre Des exemples avancés une API Oauth2 avec Tastypie et Slumber un serveur d’API un client. une revue des verbes HTTP: GET, POST, PUT, DELETE, HEAD, PATCH. . . une application de prototypage sans modèle un bon exemple d’application réutilisable (sans modèle) utilisant les capacités d’héritage des modèles Django. Des hacks!
  • 10. Les bonnes pratiques dans un projet pro La documentation d’un projet python/django reStructuredText par l’exemple les bonnes pratiques de la documentation documentation des modules, des classes, des méthodes et fonctions les principaux mots clés de reStructuredText Sphinx présentation de l’outil comment ça marche comment l’utiliser dans un projet django Le module “admindoc” Principe de fonctionnement cas d’utilisation
  • 11. Les bonnes pratiques dans un projet pro Comment hériter correctement les templates Par application un dossier template un fichier base.html un dossier template/includes Par Projet Un dossier template des dossiers par application sur-classées penser “réutilisable”
  • 12. Les patterns utiles L’héritage dans les modèles Abstract Des applications facilement surclassables Multi-table Moins de code/Plus de clarté Proxy Le plus oublié des héritages. . . Et pourtant! Profitez de la souplesse de Python Héritage de classes Création de classes ou d’objet à la volée Monkey patching: quand le besoin est impérieux
  • 13. Exemple: Un blog ultra rapide. Un blog très rapidement : L’idée Revoir en quelques lignes les grands concepts Profiter de ce qu’une installation de base peut offrir Le concept “Livré avec des piles” par l’exemple un tour rapide sur les “contrib” que l’on oublie bien souvent
  • 14. Exemple: Un blog ultra rapide. Initialisation $ django−admin . py s t a r t p r o j e c t b l o g g i n g $ cd b l o g g i n g $ python manage . py s t a r t a p p b l o g
  • 15. Exemple: Un blog ultra rapide. Configuration: base de données # b l o g g i n g / b l o g g i n g / s e t t i n g s . py ( django >= 1 . 4 ) DATABASES = { ’ default ’ : { ’ENGINE ’ : ’ django . db . backends . s q l i t e 3 ’ , ’NAME ’ : ’ d e v e l . db ’ , } }
  • 16. Exemple: Un blog ultra rapide. Configuration: applications #blogging / blogging / s e t t i n g s . py ( django >= 1 . 4 ) INSTALLED_APPS = ( ’ django . c o n t r i b . auth ’ , ’ django . c o n t r i b . contenttypes ’ , ’ django . c o n t r i b . sessions ’ , ’ django . c o n t r i b . sites ’ , ’ django . c o n t r i b . messages ’ , ’ django . c o n t r i b . staticfiles ’ , ’ django . c o n t r i b . admin ’ , ’ django . c o n t r i b . admindocs ’ , ’ django . c o n t r i b . comments ’ , ’ django . c o n t r i b . sitemaps ’ , ’ django . c o n t r i b . syndication ’ , ’ blog ’ )
  • 17. Exemple: Un blog ultra rapide. Configuration: urls pattern de base from django . c o n f . u r l s i m p o r t p a t t e r n s , i n c l u d e , u r l from django . c o n t r i b i m p o r t admin admin . a u t o d i s c o v e r ( ) u r l p a t t e r n s = p a t t e r n s ( ’ ’ , < i c i , l e s u r l s >) L’application principale u r l ( r ’ ^ blog / ’ , include ( ’ blog . u r l s ’ ) ) , La documentation Django u r l ( r ’ ^ admin / doc / ’ , i n c l u d e ( ’ django . c o n t r i b . admindocs . u r l s ’ ) ) , L’admin u r l ( r ’ ^ admin / ’ , i n c l u d e ( admin . s i t e . u r l s ) ) , Les commentaires u r l ( r ’ ^comments / ’ , i n c l u d e ( ’ django . c o n t r i b . comments . u r l s ’ ) ) ,
  • 18. Exemple: Un blog ultra rapide. Les modèles : Catégorie # b l o g g i n g / b l o g / models . py from django . db i m p o r t models from django . c o n t r i b . auth . models i m p o r t User c l a s s C a t e g o r i e ( models . Model ) : name = models . C h a r F i e l d ( max_length =250) s l u g = models . S l u g F i e l d ( max_length =250) d e f __unicode__ ( s e l f ) : r e t u r n s e l f . name
  • 19. Exemple: Un blog ultra rapide. Les models : les articles # b l o g g i n g / b l o g / models . py c l a s s A r t i c l e ( models . Model ) : t i t l e = models . C h a r F i e l d ( max_length =250) s l u g = models . S l u g F i e l d ( max_length =500) a u t h o r = models . ForeignKey ( User ) c a t e g o r i e = models . ForeignKey ( C a t e g o r i e ) p u b l i s h e d _ d a t e = models . D a t e F i e l d ( auto_now_add=True ) c o n t e n t = models . T e x t F i e l d ( ) d e f __unicode__ ( s e l f ) : return self . t i t l e def get_absolute_url ( s e l f ) : r e t u r n " / b l o g / a r t i c l e /%s " % s e l f . s l u g
  • 20. Exemple: Un blog ultra rapide. Les urls: liste des derniers articles Répondre à un besoin courant: lister les derniers objets un model un champ date. # b l o g g i n g / b l o g / u r l s . py urlpatterns = patterns ( ’ ’ , u r l ( r ’ ^$ ’ , ArchiveIndexView . as_view ( model= A r t i c l e , d a t e _ f i e l d =" published_date " ) , name= ’ home ’ ) , ) et comme toujours on nomme les urls pour les utiliser dans les templates
  • 21. Exemple: Un blog ultra rapide. Les urls: Vue en liste Les Articles un seul argument: le modèle. Dans la “vraie vie”, on pagine. url ( r ’^ articles /$ ’ , L i s t V i e w . as_view ( model= A r t i c l e ) , name= ’ a r t i c l e s ’ ) , Les Catégories u r l ( r ’ ^ categories / $ ’ , L i s t V i e w . as_view ( model= C a t e g o r i e ) , name= ’ c a t e g o r i e s ’ ) ,
  • 22. Exemple: Un blog ultra rapide. Les urls: détails des objets Les Articles on utilise le slug pour construire les urls parce que les “pk” c’est pas beau. u r l ( r ’ a r t i c l e / ( ? P< slug > [ w−]+) / $ ’ , D e t a i l V i e w . as_view ( model= A r t i c l e ) , name= ’ a r t i c l e ’ ) , Les Catégories u r l ( r ’ c a t e g o r i e / ( ? P< slug > [ w−]+) / $ ’ , D e t a i l V i e w . as_view ( model= C a t e g o r i e ) , name= ’ c a t e g o r i e ’ ) ,
  • 23. Exemple: Un blog ultra rapide. L’admin Une configuration très simple. prepopulated_fields permet d’autogénérer le “slug” à partir du titre. from django . c o n t r i b i m p o r t admin from b l o g . models i m p o r t Categorie , A r t i c l e c l a s s A r t i c l e A d m i n ( admin . ModelAdmin ) : prepopulated_fields = { " slug " : ( " t i t l e " , ) } c l a s s CategorieAdmin ( admin . ModelAdmin ) : p r e p o p u l a t e d _ f i e l d s = { " s l u g " : ( " name " , ) } admin . s i t e . r e g i s t e r ( Categorie , CategorieAdmin ) admin . s i t e . r e g i s t e r ( A r t i c l e , A r t i c l e A d m i n )
  • 24. Exemple: Un blog ultra rapide. Les templates : un menu En utilisant “include”, le menu sera sur toutes les pages Le menu est à un seul endroit clairement identifiable : DRY les urls nommées sont utiles. # b l o g / t e m p l a t e s / i n c l u d e s / menu . h t m l <ul> < l i ><a h r e f = " {% u r l home %} " > A c c u e i l < / a>< / l i > < l i ><a h r e f = " {% u r l c a t e g o r i e s %} " > C a t g o r i e s < / a>< / l i > < l i ><a h r e f = " {% u r l a r t i c l e s %} " >Tous l e s a r t i c l e s < / a>< / li> </ ul>
  • 25. Exemple: Un blog ultra rapide. Les templates : un article la présentation d’un article se fait à un seul endroit. les urls nommées acceptent des arguments #blog / templates / includes / prototype . html par < i > { { elem . a u t h o r } } < / i > dans l a c a t g o r i e <a h r e f = " {% u r l c a t e g o r i e elem . c a t e g o r i e . s l u g %} " > { { elem . c a t e g o r i e } } </a> <p > { { elem . c o n t e n t } } < / p>
  • 26. Exemple: Un blog ultra rapide. Les templates : un fichier “base.html” minimal tout ce qui doit être présenté sur toute les pages # b l o g / t e m p l a t e s / base . h t m l {% i n c l u d e " i n c l u d e s / menu . h t m l " %} {% b l o c k c o n t e n t %} {% endblock c o n t e n t %} on peut créer autant de “placeholder” que l’on veut pour structurer la page. headers custom footer etc. . .
  • 27. Exemple: Un blog ultra rapide. Les templates: vue “archive” 1. convention over configuration 2. nom du template : <nom du modèle>_archive.html {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n l a t e s t %} <h2> <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ > { { elem . t i t l e } } </a> </ h2> {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 28. Exemple: Un blog ultra rapide. Les templates: vue ArticleS Une itération simple {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n o b j e c t _ l i s t %} <h2> <a h r e f = ’ {% u r l a r t i c l e elem . s l u g %} ’ > { { elem . t i t l e } } </a> </ h2> {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 29. Exemple: Un blog ultra rapide. Les templates: CatégorieS Itérations imbriquées. {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} {% f o r elem i n o b j e c t _ l i s t %} <h2 > { { elem . name } } ( { { elem . a r t i c l e _ s e t . count } } ) </ h2> {% f o r a r t i c l e i n elem . a r t i c l e _ s e t . a l l %} <h3> <a h r e f = ’ {% u r l a r t i c l e a r t i c l e . s l u g %} ’ > {{ article . t i t l e }} </a> </ h3> {% e n d f o r %} {% e n d f o r %} {% endblock c o n t e n t %}
  • 30. Exemple: Un blog ultra rapide. Les templates: Article load_comment charge les templatetags des commentaires render_comment_list = liste des commentaires. render_comment_form = formulaire de commentaire CSRF_TOKEN, honeypot etc. . . {% extends " base . h t m l " %} {% l o a d comments %} {% b l o c k c o n t e n t %} {% w i t h o b j e c t as elem %} {% i n c l u d e " i n c l u d e s / p r o t o t y p e . h t m l " %} {% endwith %} <h3>Commentaires< / h3> {% r e n d e r _ c o m m e n t _ l i s t f o r o b j e c t %} <h3> L a i s s e r un commentaire< / h3> {% render_comment_form f o r o b j e c t %} <a h r e f = " {% u r l a r t i c l e s %} " > Retour l a l i s t e des a r t i c l e s < / a> {% endblock c o n t e n t %}
  • 31. Exemple: Un blog ultra rapide. Les templates: Catégorie {% extends " base . h t m l " %} {% b l o c k c o n t e n t %} <h2> { { o b j e c t . name } } ( { { o b j e c t . a r t i c l e _ s e t . count } } ) < / h2> {% f o r a r t i c l e i n o b j e c t . a r t i c l e _ s e t . a l l %} <h3> <a h r e f = ’{% u r l a r t i c l e a r t i c l e . s l u g %} ’> {{ article . t i t l e }} < / a> < / h3> {% e n d f o r %} <a h r e f = " {% u r l c a t e g o r i e s %} " > Retour l a l i s t e des c a t g o r i e s < / a> {% endblock c o n t e n t %}
  • 32. Exemple: Un blog ultra rapide. Le Sitemap from django . c o n t r i b . sitemaps i m p o r t GenericSitemap info_dict = { ’ queryset ’ : A r t i c l e . objects . a l l ( ) , ’ d a t e _ f i e l d ’ : ’ published_date ’ , } sitemaps = { ’ b l o g ’ : GenericSitemap ( i n f o _ d i c t , p r i o r i t y = 0 . 6 ) , } u r l ( r ’ ^ sitemap . xml$ ’ , ’ django . c o n t r i b . sitemaps . views . sitemap ’ , { ’ sitemaps ’ : sitemaps } ) ,
  • 33. Exemple: Un blog ultra rapide. Les flux rss from django . c o n t r i b . s y n d i c a t i o n . views i m p o r t Feed c l a s s L a t e s t B l o g A r t i c l e ( Feed ) : t i t l e = "Un super Blog " l i n k = " / blog / " def items ( s e l f ) : r e t u r n A r t i c l e . o b j e c t s . order_by ( ’− p u b l i s h e d _ d a t e ’ ) [ : 5 ] def i t e m _ t i t l e ( s e l f , item ) : r e t u r n item . t i t l e def i t e m _ d e s c r i p t i o n ( s e l f , item ) : r e t u r n item . content
  • 34. Conclusion Questions Des questions ?
  • 35. Conclusion Contacts yohann@gabory.fr // http://www.gabory.fr // @boblefrag
  • 36. Conclusion Licence Présentation réalisée sous org-mode Theme Beamer sous licence GPLV3 Présentation disponible sous Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non transposé https://bitbucket.org/boblefrag/django-avanc-pr-sentation- du-5-novembre/