36
[center] Django Avancé Yohann Gabory

Presentation du Livre Django Avancé

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Presentation du Livre Django Avancé

[center]

Django Avancé

Yohann Gabory

Page 2: Presentation du Livre Django Avancé

Présentation de l’auteur

Yohann GaboryWebdevelopper Outscale

Auteur chez Eyrolles

Djangonaute depuis la version 0.95

Page 3: Presentation du Livre Django Avancé

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 etexpert python/djangoÉditions Eyrolles

Page 4: Presentation du Livre Django Avancé

Pourquoi un livre en français ?

Aider les nouveaux arrivants

Le premier contact est plus facile en françaisLe succès d’un outil tient à sa documentationLa documentation française n’est plus à jour depuislooooongtemps

Page 5: Presentation du Livre Django Avancé

Pourquoi un livre en français ?

Proposer de nouvelles choses

Le framework a beaucoup évolué depuis les parutionsanglophonesC’est un framework de plus en plus largement utiliséIl est temps d’aller plus loin

Les CBVLes “Reusable Apps”Les besoins ont changé API, Oauth etc. . .

Page 6: Presentation du Livre Django Avancé

Pourquoi un livre en français ?

“Apprendre la programmation webavec Python et Django”

Un livre didactique pour les débutantsLes base de la programmation webLes notions essentiellesMise en application avec Django

Page 7: Presentation du Livre Django Avancé

Un avant-goût du contenu du livre

Des tutoriels

Un Bug TrackerParce 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

Page 8: Presentation du Livre Django Avancé

Un avant-goût du contenu du livre

Des bonnes pratiques

Comment structurer ses modèlesquels type d’héritage utiliseroù mettre la logique de votre application

Le principe du DRY : partoutDans les urls, les modèles, les vues, les templates.Un seul endroit oui mais clairement identifiable: surtout!

Découplez!Identifiez les usagesUne application == une fonctionalitéÉcrivez “plug’n play”

Les bonnes façons de résoudre les problèmes

Page 9: Presentation du Livre Django Avancé

Un avant-goût du contenu du livre

Des exemples avancés

une API Oauth2 avec Tastypie et Slumberun serveur d’APIun 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!

Page 10: Presentation du Livre Django Avancé

Les bonnes pratiques dans un projet pro

La documentation d’un projetpython/django

reStructuredText par l’exempleles bonnes pratiques de la documentationdocumentation des modules, des classes, des méthodes etfonctionsles principaux mots clés de reStructuredText

Sphinxprésentation de l’outilcomment ça marchecomment l’utiliser dans un projet django

Le module “admindoc”Principe de fonctionnementcas d’utilisation

Page 11: Presentation du Livre Django Avancé

Les bonnes pratiques dans un projet pro

Comment hériter correctement lestemplates

Par applicationun dossier templateun fichier base.htmlun dossier template/includes

Par ProjetUn dossier templatedes dossiers par application sur-classéespenser “réutilisable”

Page 12: Presentation du Livre Django Avancé

Les patterns utiles

L’héritage dans les modèles

AbstractDes applications facilement surclassables

Multi-tableMoins de code/Plus de clarté

ProxyLe plus oublié des héritages. . . Et pourtant!

Profitez de la souplesse de PythonHéritage de classesCréation de classes ou d’objet à la voléeMonkey patching: quand le besoin est impérieux

Page 13: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Un blog très rapidement : L’idée

Revoir en quelques lignes les grands conceptsProfiter de ce qu’une installation de base peut offrirLe concept “Livré avec des piles” par l’exempleun tour rapide sur les “contrib” que l’on oublie bien souvent

Page 14: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Initialisation

$ django−admin . py s t a r t p r o j e c t b logg ing$ cd blogging$ python manage . py s ta r tapp blog

Page 15: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Configuration: base de données

#blogging / b logg ing / s e t t i n g s . py ( django >= 1 .4 )DATABASES = {

’ d e f a u l t ’ : {’ENGINE ’ : ’ django . db . backends . s q l i t e 3 ’ ,’NAME ’ : ’ devel . db ’ ,

}}

Page 16: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Configuration: applications

#blogging / b logg ing / 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 . content types ’ ,’ django . c o n t r i b . sessions ’ ,’ django . c o n t r i b . s i t e s ’ ,’ django . c o n t r i b . messages ’ ,’ django . c o n t r i b . s t a t i c f i l e s ’ ,’ 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 . synd i ca t i on ’ ,’ b log ’

)

Page 17: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Configuration: urlspattern de basefrom django . conf . u r l s impor t pa t te rns , inc lude , u r lfrom django . c o n t r i b impor t adminadmin . autod iscover ( )u r l p a t t e r n s = pa t te rns ( ’ ’ , < i c i , l es u r l s >)

L’application principaleu r l ( r ’ ^ blog / ’ , i nc lude ( ’ b log . u r l s ’ ) ) ,

La documentation Djangou r l ( r ’ ^admin / doc / ’ ,

i nc lude ( ’ django . c o n t r i b . admindocs . u r l s ’ ) ) ,

L’adminu r l ( r ’ ^admin / ’ , i nc lude ( admin . s i t e . u r l s ) ) ,

Les commentairesu r l ( r ’ ^comments / ’ ,

i nc lude ( ’ django . c o n t r i b . comments . u r l s ’ ) ) ,

Page 18: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les modèles : Catégorie

#blogging / blog / models . py

from django . db impor t modelsfrom django . c o n t r i b . auth . models impor t User

c lass Categor ie ( models . Model ) :name = models . CharFie ld ( max_length =250)s lug = models . S lugF ie ld ( max_length =250)

def __unicode__ ( s e l f ) :r e t u r n s e l f . name

Page 19: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les models : les articles

#blogging / blog / models . py

c lass A r t i c l e ( models . Model ) :t i t l e = models . CharFie ld ( max_length =250)s lug = models . S lugF ie ld ( max_length =500)author = models . ForeignKey ( User )ca tegor ie = models . ForeignKey ( Categor ie )publ ished_date = models . DateFie ld ( auto_now_add=True )content = models . Tex tF ie ld ( )

def __unicode__ ( s e l f ) :r e t u r n s e l f . t i t l e

def ge t_abso lu te_u r l ( s e l f ) :r e t u r n " / b log / a r t i c l e /%s " % s e l f . s lug

Page 20: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les urls: liste des derniers articles

Répondre à un besoin courant: lister les derniers objetsun modelun champ date.

#blogging / blog / u r l s . pyu r l p a t t e r n s = pa t te rns ( ’ ’ ,

u r l ( r ’ ^$ ’ , ArchiveIndexView . as_view (model= A r t i c l e ,d a t e _ f i e l d =" publ ished_date " ) ,

name= ’home ’ ) ,)

et comme toujours on nomme les urls pour les utiliser dansles templates

Page 21: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les urls: Vue en liste

Les Articlesun seul argument: le modèle. Dans la “vraie vie”, on pagine.

u r l ( r ’ ^ a r t i c l e s / $ ’ ,L is tV iew . 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 ’ ^ ca tegor ies / $ ’ ,L is tV iew . as_view ( model=Categor ie ) ,

name= ’ ca tegor ies ’ ) ,

Page 22: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les urls: détails des objets

Les Articleson 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− ]+) / $ ’ ,Deta i lV iew . 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 ’ ca tegor ie / ( ?P<slug > [ \w− ]+) / $ ’ ,Deta i lV iew . as_view ( model=Categor ie ) ,

name= ’ ca tegor ie ’ ) ,

Page 23: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

L’adminUne configuration très simple.

prepopulated_fields permet d’autogénérer le “slug” à partirdu titre.

from django . c o n t r i b impor t adminfrom blog . models impor t Categorie , A r t i c l e

c lass Ar t i c leAdmin ( admin . ModelAdmin ) :p repopu la ted_ f i e l ds = { " s lug " : ( " t i t l e " , ) }

c lass CategorieAdmin ( admin . ModelAdmin ) :p repopu la ted_ f i e l ds = { " s lug " : ( "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 , Ar t i c leAdmin )

Page 24: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates : un menu

En utilisant “include”, le menu sera sur toutes les pagesLe menu est à un seul endroit clairement identifiable : DRYles urls nommées sont utiles.

#blog / templates / inc ludes / menu . html< u l >

< l i ><a h re f = " {% u r l home %}">Accue i l< / a>< / l i >< l i ><a h re f = " {% u r l ca tegor ies %}"> C a t g o r i e s < / a>< / l i >< l i ><a h re f = " {% u r l a r t i c l e s %}">Tous les a r t i c l e s < / a><

/ l i >< / u l >

Page 25: Presentation du Livre Django Avancé

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 / inc ludes / p ro to type . htmlpar < i > { { elem . author } } < / i > dans l a c a t g o r i e<a h re f = " {% u r l ca tegor ie elem . ca tegor ie . s lug %}">

{ { elem . ca tegor ie } }</a><p > { { elem . content } } < / p>

Page 26: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates : un fichier “base.html”minimal

tout ce qui doit être présenté sur toute les pages

#blog / templates / base . html{% inc lude " inc ludes / menu . html " %}{% block content %}{% endblock content %}

on peut créer autant de “placeholder” que l’on veut pourstructurer la page.

headers customfooteretc. . .

Page 27: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates: vue “archive”

1. convention over configuration2. nom du template : <nom du modèle>_archive.html

{% extends " base . html " %}{% block content %}

{% f o r elem i n l a t e s t %}<h2>

<a h re f = ’ {% u r l a r t i c l e elem . s lug %} ’>{ { elem . t i t l e } }

</a></h2>{% inc lude " inc ludes / p ro to type . html " %}

{% endfor %}{% endblock content %}

Page 28: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates: vue ArticleS

Une itération simple

{% extends " base . html " %}{% block content %}

{% f o r elem i n o b j e c t _ l i s t %}<h2>

<a h re f = ’ {% u r l a r t i c l e elem . s lug %} ’>{ { elem . t i t l e } }

</a></h2>{% inc lude " inc ludes / p ro to type . html " %}

{% endfor %}{% endblock content %}

Page 29: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates: CatégorieSItérations imbriquées.

{% extends " base . html " %}{% block content %}

{% 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 re f = ’ {% u r l a r t i c l e a r t i c l e . s lug %} ’>

{ { a r t i c l e . t i t l e } }</a>

</h3>{% endfor %}

{% endfor %}

{% endblock content %}

Page 30: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates: Articleload_comment charge les templatetags des commentairesrender_comment_list = liste des commentaires.render_comment_form = formulaire de commentaire

CSRF_TOKEN, honeypot etc. . .

{% extends " base . html " %}{% load comments %}{% block content %}{% wi th ob jec t as elem %}{% inc lude " inc ludes / p ro to type . html " %}{% endwith %}<h3>Commentaires< / h3>{% render_comment_l is t f o r ob jec t %}<h3>La isser un commentaire< / h3>{% render_comment_form f o r ob jec t %}<a h re 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 content %}

Page 31: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les templates: Catégorie

{% extends " base . html " %}{% block content %}<h2> { { ob jec t . name } } ( { { ob jec 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 ob jec t . a r t i c l e _ s e t . a l l %}<h3>

<a h re f = ’{% u r l a r t i c l e a r t i c l e . s lug %} ’>{ { a r t i c l e . t i t l e } }

< / a>< / h3>

{% endfor %}<a h re f = " {% u r l ca tegor ies %}">

Retour l a l i s t e des c a t g o r i e s< / a>{% endblock content %}

Page 32: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Le Sitemap

from django . c o n t r i b . sitemaps impor t GenericSitemap

i n f o _ d i c t = {’ queryset ’ : A r t i c l e . ob jec ts . a l l ( ) ,’ d a t e _ f i e l d ’ : ’ publ ished_date ’ ,

}

sitemaps = {’ b log ’ : 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 ’ ,{ ’ si temaps ’ : sitemaps } ) ,

Page 33: Presentation du Livre Django Avancé

Exemple: Un blog ultra rapide.

Les flux rss

from django . c o n t r i b . synd i ca t i on . views impor t Feedc lass 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 = " / b log / "

def i tems ( s e l f ) :r e t u r n A r t i c l e . ob jec ts . order_by (

’−publ ished_date ’ ) [ : 5 ]

def i t e m _ t i t l e ( s e l f , i tem ) :r e t u r n i tem . t i t l e

def i t em_desc r i p t i on ( s e l f , i tem ) :r e t u r n i tem . content

Page 34: Presentation du Livre Django Avancé

Conclusion

Questions

Des questions ?

Page 35: Presentation du Livre Django Avancé

Conclusion

Contacts

[email protected] // http://www.gabory.fr // @boblefrag

Page 36: Presentation du Livre Django Avancé

Conclusion

Licence

Présentation réalisée sous org-modeTheme Beamer sous licence GPLV3Présentation disponible sous Creative CommonsAttribution - Partage dans les Mêmes Conditions 3.0 nontransposéhttps://bitbucket.org/boblefrag/django-avanc-pr-sentation-du-5-novembre/