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.
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
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/