Upload
yohanngabory
View
2.024
Download
0
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
[center]
Django Avancé
Yohann Gabory
Présentation de l’auteur
Yohann GaboryWebdevelopper Outscale
Auteur chez Eyrolles
Djangonaute depuis la version 0.95
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
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
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. . .
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
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
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
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!
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
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”
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
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
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
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 ’ ,
}}
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 ’
)
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 ’ ) ) ,
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
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
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
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 ’ ) ,
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 ’ ) ,
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 )
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 >
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>
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. . .
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 %}
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 %}
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 %}
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 %}
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 %}
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 } ) ,
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
Conclusion
Questions
Des questions ?
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/