davin.baragiotta 30/08/2012 02:20:41 --------------- DÉBUT ATELIER DJANGO : Architecture d'un projet + Backend ----------------------------- {{{#!python Bonjour 30/08/2012 02:20:45 le contenu de l'atelier est ici : 30/08/2012 02:20:50 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 02:20:56 INTRODUCTION 30/08/2012 02:21:01 Aujourd'hui on se fait plaisir.... on monte en puissance en Python 30/08/2012 02:21:18 et on va utiliser un framework de développement web 30/08/2012 02:21:32 Django 30/08/2012 02:21:34 notre objectif est de comprendre à quoi ressemble un projet Django (architecture des fichiers) 30/08/2012 02:21:52 mais aussi de gérer les données 30/08/2012 02:22:00 dans une interface d'administration 30/08/2012 02:22:06 Documentation : 30/08/2012 02:22:10 sur la page web de l,atelier 30/08/2012 02:22:17 des liens vers la doc officielle 30/08/2012 02:22:22 attention, la doc officielle vient en plusieurs versions 30/08/2012 02:22:42 choisir la bonne en bas à droite de la doc Django... 30/08/2012 02:22:59 (je viens de mettre à jour lien vers doc 1.4) 30/08/2012 02:23:19 sur la page de la documentation Django 30/08/2012 02:23:33 (allons-y tous) 30/08/2012 02:23:37 https://docs.djangoproject.com/en/1.4/ 30/08/2012 02:23:44 En plein milieu (sous First steps) y'a Tutorial 30/08/2012 02:24:03 aujourd'hui, on va couvrir une partie du tutoriel 30/08/2012 02:24:16 si vous assitez à l,atelier de demain, on couvrir presque tout le tutoriel, au total... 30/08/2012 02:24:35 gardez la page de doc ouverte, on va y revenir 30/08/2012 02:24:52 Environnement technique 30/08/2012 02:25:15 je suppose que tout le monde a Django d'installé 30/08/2012 02:25:25 l'atelier est monté pour Django 1.4 30/08/2012 02:25:31 mais 30/08/2012 02:25:33 y'a pas grand différence (en tout cas pour le contenu couvert dans l,atelier) 30/08/2012 02:25:51 entre 1.1.1 et 1.4 30/08/2012 02:25:54 doc je dirai où y,a des différences 30/08/2012 02:26:01 pour ceux qui ont 1.1.1 (je suis qu'il y en a ) 30/08/2012 02:26:11 aussi 30/08/2012 02:26:17 South est optionnel... mais c'est vraaaaaaaaaaaaiment mieux avec South 30/08/2012 02:26:30 pour tester vos installations : 30/08/2012 02:26:38 ipython 30/08/2012 02:26:43 import django 30/08/2012 02:26:48 django.get_version() 30/08/2012 02:26:53 moi j'ai 1.4 30/08/2012 02:26:56 import south 30/08/2012 02:26:59 moi j'ai 0.7.4 30/08/2012 02:27:05 (mais peut importe version de South pour l,atelier) 30/08/2012 02:27:23 ok, dernier point avant de commencer pour vrai 30/08/2012 02:27:33 Django à l'AUF 30/08/2012 02:27:38 l'idée = de coder des applications web 30/08/2012 02:27:45 les apps web seront déployées sur des serveurs 30/08/2012 02:27:54 on veut donc des apps montées avec une version de Django que debian suit 30/08/2012 02:28:08 afin de bénéficier du suivi de debian, notamment au niveau de sécurité 30/08/2012 02:28:23 squeeze = django 1.2 sauf erreur 30/08/2012 02:28:35 et ubuntu = 1.1.1 (version 10.04 officielle de l'AUF) 30/08/2012 02:28:51 pour l'équipe SI... on utilise les dernières versions, car on les suit manuellement pour les mises à jour (on s'écarte de debian) 30/08/2012 02:29:17 voilà donc pour l'intro 30/08/2012 02:29:22 PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET 30/08/2012 02:29:30 Juste un petit topo sur le développement web 30/08/2012 02:29:42 ça peut paraître inutile pour certains... mais ça fait pas de mal : rappel : 30/08/2012 02:29:58 j'ai fait un schéma sur le développement web 30/08/2012 02:30:09 http://montrealpython.org/r/attachments/13/web-development.jpg 30/08/2012 02:30:14 notre but, est de coder une application qui va : 30/08/2012 02:30:37 créer une réponse 30/08/2012 02:30:41 à une requête 30/08/2012 02:30:44 tout simplement 30/08/2012 02:30:49 la requête est acheminée via protocole HTTP... 30/08/2012 02:31:06 ... passse par le serveur Apache qui va déléguer le travail à l'application Django via WSGI (web service gateway interface) 30/08/2012 02:31:41 le plus important pour notre atelier = partie de droite 30/08/2012 02:31:57 le "projet" django qu'on va créer 30/08/2012 02:32:06 suit le modèle MVC : models, view, controller 30/08/2012 02:32:20 un pattern de développement logiciel 30/08/2012 02:32:31 à droite complètement 30/08/2012 02:32:38 je vous montre le flux d'info à travers les fichiers de Django.... 30/08/2012 02:32:54 d'abord la requête entre dans urls.py (grosso modo) 30/08/2012 02:33:05 et finalement, Django répond en ayant fait le "rendering" d'un template... 30/08/2012 02:33:27 on verra tout ça en détail dans atelier frontend 30/08/2012 02:33:46 aujourd'hui, on va se concentré sur l'admin... qui fait le boulot (automatiquement) pour répondre aux requêtes 30/08/2012 02:34:21 finalement 30/08/2012 02:34:24 la réponse, dans notre cas, sera du HTML + CSS envoyé en HTTP 30/08/2012 02:34:43 mais 30/08/2012 02:34:44 ça pourrait être n'importe quoi (XML, json, etc....) 30/08/2012 02:34:59 RSS, par exemple 30/08/2012 02:35:06 donc... on va coder "côté serveur" une application web 30/08/2012 02:35:23 c'est parti! 30/08/2012 02:35:27 (gardez le schéma sous le coude, au besoin) 30/08/2012 02:35:35 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 02:35:42 ah oui... 30/08/2012 02:35:50 les environnements 30/08/2012 02:35:54 on ne codera pas directement sur le serveur! 30/08/2012 02:36:03 on travail en local pour faire notre développement 30/08/2012 02:36:11 (idéalement avec un suivi sur git ) 30/08/2012 02:36:19 après, on déploie sur les serveurs... dans des environnements de TEST (pour faire tester les users) 30/08/2012 02:36:41 puis sur PROD quand tout est ok 30/08/2012 02:36:47 voilà pour notre processus de travail réel dans l'équipe SI à l'AUF 30/08/2012 02:36:59 ok 30/08/2012 02:37:02 Django 30/08/2012 02:37:04 Pourquoi Django et pas un autre... 30/08/2012 02:37:10 je vous laisse lire rapido sur la page web 30/08/2012 02:37:18 mais en gros... car Django est bien intégré, bien documenté et l'admin est cool 30/08/2012 02:37:44 Principaux fichiers : on vient d'en parler avec le schéma... on les verra un à un dans un instant 30/08/2012 02:38:10 ok, pour travailler sur un projet vraisemblable 30/08/2012 02:38:29 je vous ai donné un petit scénario 30/08/2012 02:38:37 Projet : définition du besoin 30/08/2012 02:38:45 je vous laisse lire ça 30/08/2012 02:38:53 oui... ça ressemble à du réel... 30/08/2012 02:39:00 lister les établissements, lister leurs formations... 30/08/2012 02:39:12 donc si on essaie de modéliser un peut ce qui est écrit... en ciblant les mots-clés 30/08/2012 02:39:28 (modélisation : on fait ça dans le cycle de nos projets informatiques... avant de coder) 30/08/2012 02:39:42 on se rend compte qu'on veut gérer des Personnes, des Etablissements, des Formations et des Laboratoires 30/08/2012 02:40:04 allons-y... codons! 30/08/2012 02:40:15 PARTIE 2 : PROJET ET APPLICATIONS 30/08/2012 02:40:21 lancez un terminal 30/08/2012 02:40:29 on va créer le projet django 30/08/2012 02:40:34 dans un répertoire où vous voulez stocker vos projets 30/08/2012 02:40:47 lancez cette commande dans le terminal : django-admin.py startproject carto 30/08/2012 02:41:00 notre projet s'appelle "carto"... pour cartographie 30/08/2012 02:41:16 pas de problème? pas de question? 30/08/2012 02:41:28 (je code en même temps que vous) 30/08/2012 02:41:34 Tri 30/08/2012 02:41:41 pas encore! davin.baragiotta 30/08/2012 02:41:54 (je réorganise mes fenêtres ) ok super 30/08/2012 02:42:39 ensuite allez dans le projet 30/08/2012 02:42:44 la première commande appelle un fichier dans vos sources Django sur votre machine... car ce script python "django-admin.py" est dans votre PATH python 30/08/2012 02:43:24 maintenant... on va juste travailler dans le répertoire courant... 30/08/2012 02:43:36 cd carto 30/08/2012 02:43:39 on a créé un projet... en fait django a juste créé des fichiers pour vous... que vous auriez pu coder 30/08/2012 02:44:04 mais on veut pas les coder 30/08/2012 02:44:08 on va regarder ces fichiers 30/08/2012 02:44:14 truong.tung.lam a rejoint le salon 02:44 Tri 30/08/2012 02:44:28 [09:44:26] tran.xuan.huy: j'ai probleme: django-admin.py : commande introuvable davin.baragiotta 30/08/2012 02:44:48 il est sur Ubuntu ou Mac? Tri 30/08/2012 02:44:59 ubuntu davin.baragiotta 30/08/2012 02:45:04 essaie avec sudo Tri 30/08/2012 02:45:12 django-admin startproject carto ? davin.baragiotta 30/08/2012 02:45:18 ou donner fullpath du script ah oui exact 30/08/2012 02:45:22 ".py" pas nécessaire toujours (vieilles versions?) 30/08/2012 02:45:40 problème réglé? 30/08/2012 02:45:47 Tri 30/08/2012 02:45:56 oui, je pense davin.baragiotta 30/08/2012 02:46:00 super donc 30/08/2012 02:46:02 en django 1.4... django crée un autre répertoire carto dans carto.... bon 30/08/2012 02:46:22 à la racine.... on voit manage.py 30/08/2012 02:46:33 manage.py est le cerveau de Django... on va lui passer les commandes 30/08/2012 02:46:49 donc on fait plus de django-admin.... 30/08/2012 02:46:55 on va faire python manage.py.... 30/08/2012 02:47:02 donc en gros : on touche pas à ce fichier 30/08/2012 02:47:12 allons dans carto 30/08/2012 02:47:15 shafeek.sumser a rejoint le salon 02:47 davin.baragiotta 30/08/2012 02:47:25 __init__.py ça c,est juste pour dire qu'on est dans un module python (on en a parlé dans atelier python) 30/08/2012 02:47:40 on fait rien avec ça 30/08/2012 02:47:46 30/08/2012 02:47:47 wsgi.py : ça ça sert juste pour servir l'application.... 30/08/2012 02:48:07 dans les vieilles versions, il n'est pas là... 30/08/2012 02:48:15 on fait rien avec 30/08/2012 02:48:18 30/08/2012 02:48:19 finalement... y,a settings.py.... ben c'est la config 30/08/2012 02:48:32 ça on va travailler avec! 30/08/2012 02:48:37 et puis y'a urls.py : 30/08/2012 02:48:44 rappelez-vous du schéma... c'est notre point d'entrée... on va y revenir 30/08/2012 02:48:59 ok, fin du survol 30/08/2012 02:49:06 lançons le serveur de développement local 30/08/2012 02:49:20 on demande au script manage.py de servir notre application web sur le localhost 30/08/2012 02:49:37 tapez dans terminal : python manage.py runserver 30/08/2012 02:49:49 (avec le .py ) 30/08/2012 02:49:53 allons sur l'URL fournie : 30/08/2012 02:50:18 http://127.0.0.1:8000/ 30/08/2012 02:50:26 (avec navigateur web, of course) 30/08/2012 02:50:40 Tadaaaaaaaaaaam! 30/08/2012 02:50:44 on a un application web qui marche... ou presque 30/08/2012 02:50:56 doan.manh.ha a quitté la salle 02:51 davin.baragiotta 30/08/2012 02:51:23 si vous lisez l'anglais... Django nous donne des instructions après nous avoir dit qu'on avait rien fait! travaillons, donc! 30/08/2012 02:51:29 oui, nous voulons utiliser une base de données... 30/08/2012 02:51:48 pour stocker nos data sur les Personnes, Etablissements... 30/08/2012 02:52:01 mais 30/08/2012 02:52:03 on va pas se casser la tête avec une MySQL ou autre 30/08/2012 02:52:13 on va utiliser sqlite 30/08/2012 02:52:22 mais dans tout les cas... faut configurer l,accès aux DB : 30/08/2012 02:52:36 ouvrez settings.py dans éditeur 30/08/2012 02:52:47 vous voyez un dictionnaire python 30/08/2012 02:53:00 appelé DATABASES 30/08/2012 02:53:06 pour vieilles versions... les clés du dictionnaire sont autant de variable ; DATABASE_* 30/08/2012 02:53:32 comme sur la page de l,atelier 30/08/2012 02:53:45 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 02:53:45 on va configurer en disant que le ENGINE est sqlite3 30/08/2012 02:53:58 et que le NAME de la DATABASE sera carto.db 30/08/2012 02:54:08 questions? 30/08/2012 02:54:33 Tri 30/08/2012 02:54:43 pas encore... davin.baragiotta 30/08/2012 02:54:50 cool ok super... on a donc fait un premier truc demandé sur : http://127.0.0.1:8000/ 30/08/2012 02:55:07 30/08/2012 02:55:09 ensuite on nous dit de créer notre première application... 30/08/2012 02:55:22 il nous donne même la commande! 30/08/2012 02:55:28 ahaha 30/08/2012 02:55:29 on va réfléchir un peu quand même : 30/08/2012 02:55:37 c'est quoi une application? 30/08/2012 02:55:44 bon... simplement... c'est du regroupement de code 30/08/2012 02:55:53 qui "fait un truc" 30/08/2012 02:55:59 on pourrait regrouper un peu n'importe comment... 30/08/2012 02:56:10 ... les choix de découpage relève du "génie logiciel"... 30/08/2012 02:56:24 ou du gros bon sens 30/08/2012 02:56:28 mais on s'obstine souvent dans l'équipe sur : quoi va où? 30/08/2012 02:56:45 et sur : comment nommer quoi? 30/08/2012 02:56:53 ici, je vais vous simplifier la vie : je décide 30/08/2012 02:57:01 on va créer une application nommée "annuaire" 30/08/2012 02:57:10 sont but, c'est de stocker nos infos de base sur les Personnes et les Etablissements... 30/08/2012 02:57:27 un annuaire des personnes et établissements quoi 30/08/2012 02:57:34 après, on fera des apps pour gérer les formations et la recherche... 30/08/2012 02:57:49 on pourrait tout mettre au même endroit... 30/08/2012 02:57:58 génie logiciel 30/08/2012 02:58:03 bon 30/08/2012 02:58:05 go : python manage.py startapp annuaire 30/08/2012 02:58:16 ah... 30/08/2012 02:58:28 pas besoin de toujours fermer le serveur 30/08/2012 02:58:35 lancez un autre terminal à côté 30/08/2012 02:58:40 ok on voit quoi? 30/08/2012 02:59:03 giotta@machina:~/projets/carto$ ls annuaire carto manage.py giotta@machina:~/projets/carto$ cd annuaire giotta@machina:~/projets/carto/annuaire$ ls __init__.py models.py tests.py views.py 30/08/2012 02:59:19 __init__.py : on connait, pas intéressant... 30/08/2012 02:59:41 tests.py ; là on va coder tests unitaires (on le fait pas dans atelier) 30/08/2012 02:59:55 models.py et views.py sont dans le schéma que je vous ai montré 30/08/2012 03:00:08 views.py sera vu dans atelier sur Frontend 30/08/2012 03:00:28 models.py... on va y mettre le résultat de notre "modélisation"... 30/08/2012 03:00:42 nos modèles... nos classes python... 30/08/2012 03:00:54 ok, retournons au plan de match... 30/08/2012 03:01:10 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 03:01:18 on vient de créer l'application 30/08/2012 03:01:30 si on fait refresh de notre : http://127.0.0.1:8000/ 30/08/2012 03:01:41 ben il se passe rien de plus... 30/08/2012 03:01:51 ... c'est qu'il faut maintenant coder nos modèles! 30/08/2012 03:01:59 alors... codons! 30/08/2012 03:02:02 là... on va sérieusement avoir besoin de la doc! 30/08/2012 03:02:11 ouvrez models.py 30/08/2012 03:02:20 ouvrez doc django dans navigateur 30/08/2012 03:02:33 la doc django est très bien faite 30/08/2012 03:02:42 à gauche, vous voyez les grands blocs de la doc : 30/08/2012 03:02:55 model layer 30/08/2012 03:03:00 template layer 30/08/2012 03:03:05 view layer 30/08/2012 03:03:08 forms 30/08/2012 03:03:13 template et views = atelier Frontend 30/08/2012 03:03:24 forms = pas couvert dans ateliers 30/08/2012 03:03:32 model layer : on va y aller tout de suite 30/08/2012 03:03:40 le lien Model syntax : https://docs.djangoproject.com/en/1.4/topics/db/models/ 30/08/2012 03:03:56 c'est l'info pour comprendre comment coder les modèles... 30/08/2012 03:04:12 doan.manh.ha a rejoint le salon 03:04 davin.baragiotta 30/08/2012 03:04:19 ça fait environ 20 pages imprimées important de le lire un jour... 30/08/2012 03:04:27 pas maintenant 30/08/2012 03:04:30 à côté 30/08/2012 03:04:33 Field types... 30/08/2012 03:04:38 ça c'est les champs possible qu'on peut créer dans un modèle 30/08/2012 03:04:54 allons y!!!! 30/08/2012 03:04:56 https://docs.djangoproject.com/en/1.4/ref/models/fields/ 30/08/2012 03:05:03 ok dans vos sources... vous allez copier le contenu qu'il y a sur page atelier : 30/08/2012 03:05:22 from django.db import models class Etablissement(models.Model): pass # coder les champs ici class Personne(models.Model): pass # coder les champs ici 30/08/2012 03:05:46 ach... avec bonne indentation 30/08/2012 03:05:54 (4 espaces pour chaque indentation) 30/08/2012 03:06:20 lisons ce code 30/08/2012 03:06:24 en haut... l'import 30/08/2012 03:06:29 ça se lit : 30/08/2012 03:06:33 à partir du module "django.db"... importe moi les "models" 30/08/2012 03:06:50 donc le nom "models" est maintenant accessible partout dans le script models.py 30/08/2012 03:07:05 on peut donc l'utiliser 30/08/2012 03:07:10 ensuite... on crée des classe Python 30/08/2012 03:07:25 entre les parenthèse : models.Model 30/08/2012 03:07:34 c'est la syntaxe pour l'héritage en Python 30/08/2012 03:07:48 Etablissement hérite de models.Model... 30/08/2012 03:08:00 doan.manh.ha a quitté la salle 03:08 davin.baragiotta 30/08/2012 03:08:25 ce sera très important pour l'atelier frontend quand on parlera de l'ORM (le lien Python avec la base de données) ok 30/08/2012 03:08:27 pass : en python ça veut juste rien dire... 30/08/2012 03:08:36 notre boulot : 30/08/2012 03:08:43 remplacer pass par du vrai code... 30/08/2012 03:08:49 mais on veut coder quoi?!?!?! 30/08/2012 03:08:54 et bien notre classe "représente" un Etablissement... ou une Personne 30/08/2012 03:09:14 on aura une table dans notre DB pour chaque classe 30/08/2012 03:09:30 là... faut définir nos colonnes de DB 30/08/2012 03:09:37 nos "champs" de formulaire pour saisir un Etablissement ou une Personne... 30/08/2012 03:09:53 les attributs de l'objet quoi! 30/08/2012 03:10:01 ok... alors... qu'est-ce qu'on peut bien vouloir savoir d'un établissement ou d'une personne... 30/08/2012 03:10:19 disons, pour commencer : leur nom! 30/08/2012 03:10:25 maitenant... quel type de champ (Field type) vous utiliseriez 30/08/2012 03:10:47 pour capter un nom? 30/08/2012 03:10:52 allons voir la doc... 30/08/2012 03:10:56 https://docs.djangoproject.com/en/1.4/ref/models/fields/ 30/08/2012 03:11:05 à droite... c'est super... on voit tous les Field types possible 30/08/2012 03:11:22 lisons et réfléchissons 30/08/2012 03:11:28 AutoField : champ automatique... non 30/08/2012 03:11:39 Integer : entier... nom 30/08/2012 03:11:45 Boolean : non 30/08/2012 03:11:50 CharField... ah? 30/08/2012 03:11:55 lisons 30/08/2012 03:11:56 https://docs.djangoproject.com/en/1.4/ref/models/fields/#charfield 30/08/2012 03:12:03 a string field... excellent! 30/08/2012 03:12:14 on voit que "max_lenght" est obligatoire (car pas [entre crochets] dans la signature de la classe.... mais c'est aussi écrit) 30/08/2012 03:13:01 CharField has one extra required argument: 30/08/2012 03:13:14 required 30/08/2012 03:13:16 ok... codons ça 30/08/2012 03:13:22 Tri 30/08/2012 03:13:34 [10:13:21] Khone: Question: dans la classe Etablissement, on va mètre seulemnt le nom et rien d'autre ? davin.baragiotta 30/08/2012 03:13:42 pour tout de suite oui... tu peux ajouter adresse si tu veux... pays... ce que tu veux 30/08/2012 03:14:03 mais faut juste trouver les bons FieldTypes... 30/08/2012 03:14:12 plus loin, on va lier les Etablissements et les Personnes! 30/08/2012 03:14:24 30/08/2012 03:14:25 foreignkey 30/08/2012 03:14:35 class Etablissement(models.Model): nom = models.CharField(max_lenght=255) 30/08/2012 03:14:59 ça devrait ressembler à ça, votre code... 30/08/2012 03:15:10 on peut faire pareil pour Personne 30/08/2012 03:15:19 (copier-coller) 30/08/2012 03:15:24 wow on a 2 modèles... simples, mais quand même 30/08/2012 03:15:45 from django.db import models class Etablissement(models.Model): nom = models.CharField(max_lenght=255) class Personne(models.Model): nom = models.CharField(max_lenght=255) 30/08/2012 03:15:50 super... ensuite l'idée c'est qu'on veut pouvoir gérer (ajouter, modifier, supprimer) ces objets 30/08/2012 03:16:16 dans l'admin! 30/08/2012 03:16:19 on veut PAS coder les interfaces de gestion 30/08/2012 03:16:31 et l,admin de django génère justement automatiquement les interfaces 30/08/2012 03:16:47 plan de match : 30/08/2012 03:16:53 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 03:17:05 on a créé l'application 30/08/2012 03:17:09 on a créé 2 modèles... 30/08/2012 03:17:14 mais... 30/08/2012 03:17:15 django n'est pas au courant que cette application existe... 30/08/2012 03:17:26 ... faut la déclarer dans nos settings... 30/08/2012 03:17:33 ouvrez settings.py 30/08/2012 03:17:40 quelque part vers la fin 30/08/2012 03:18:05 on a le paramètre : 30/08/2012 03:18:09 INSTALLED_APPS 30/08/2012 03:18:09 c'est un tuple python 30/08/2012 03:18:16 on va rajouter un élément à ce tuple 30/08/2012 03:18:29 'annuaire', 30/08/2012 03:18:42 on ajoute, bien indenté, le nom de notre app... 30/08/2012 03:18:57 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'annuaire', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) 30/08/2012 03:19:06 ok finalement.... on y est presque... 30/08/2012 03:19:40 des questions jusqu'à maintenant? 30/08/2012 03:19:46 Tri 30/08/2012 03:20:07 non davin.baragiotta 30/08/2012 03:20:13 super qu'est-ce qui nous manque pour gérer nos données? 30/08/2012 03:20:23 les interfaces? oui... 30/08/2012 03:20:28 mais aussi... la base de données... 30/08/2012 03:20:35 on a juste déclaré où on la voulait... avec quelle techno 30/08/2012 03:20:47 mais on l'a pas créé 30/08/2012 03:20:51 or nos "objets" (instances de nos classes) vont être stockés là 30/08/2012 03:21:12 là je vais parler de South 30/08/2012 03:21:28 et vous dire pourquoi il nous sauve la vie... 30/08/2012 03:21:35 on pourrait créer tout de suite la DB 30/08/2012 03:21:47 mais 30/08/2012 03:22:01 les tables de la DB doivent *suivre* les champs de models.py 30/08/2012 03:22:30 quand on développe : on ajouter des trucs... on supprime notre code... 30/08/2012 03:22:44 mais faut faire pareil avec la DB 30/08/2012 03:22:51 oui, on pourrait faire du SQL 30/08/2012 03:22:57 mais on veut pas... 30/08/2012 03:23:01 on veut juste faire du Python 30/08/2012 03:23:05 on pourrait faire ALTER TABLE 30/08/2012 03:23:14 CREATE TABLE 30/08/2012 03:23:18 etc. 30/08/2012 03:23:19 mais c'est pas cool pour nous qui utilisons Python et Dajngo pour du RAD : rapid application developement 30/08/2012 03:23:40 donc 30/08/2012 03:23:41 il nous faut un outil 30/08/2012 03:23:45 qui applique les modifications faites à nos modèles (classes)... sur les tables de la DB 30/08/2012 03:24:04 du versionnage de DB, en quelque sorte! 30/08/2012 03:24:12 ça s'appelle de la migration de données 30/08/2012 03:24:22 South est un outil de migration de données 30/08/2012 03:24:33 South est installé sur vos machines... le software est prêt à être utilisé 30/08/2012 03:25:07 on va donc dire que notre projet Django veut l'utiliser.... 30/08/2012 03:25:17 allons dans settings.py : 30/08/2012 03:25:23 ajoutons simplement : 'south', 30/08/2012 03:25:31 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'annuaire', 'south', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) 30/08/2012 03:26:00 voilà c'est fait 30/08/2012 03:26:07 ok... on va maintenant utiliser south 30/08/2012 03:26:15 go : python manage.py schemamigration annuaire --initial 30/08/2012 03:26:38 bosco.boukone 30/08/2012 03:27:13 exit davin.baragiotta 30/08/2012 03:27:40 ok j'ai eu 2 probl : 1. j'étais pas dans le répertoire racine du projet (à côté de manage.py) 30/08/2012 03:27:58 2. j'ai fait erreur de syntaxe dans modèles 30/08/2012 03:28:07 lenght 30/08/2012 03:28:12 c'est compliqué l'anglais 30/08/2012 03:28:25 from django.db import models class Etablissement(models.Model): nom = models.CharField(max_length=255) class Personne(models.Model): nom = models.CharField(max_length=255) 30/08/2012 03:28:47 giotta@machina:~/projets/carto$ python manage.py schemamigration annuaire --initial Creating migrations directory at '/home/giotta/projets/carto/annuaire/migrations'... Creating __init__.py in '/home/giotta/projets/carto/annuaire/migrations'... + Added model annuaire.Etablissement + Added model annuaire.Personne Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate annuaire 30/08/2012 03:29:02 tout le monde a ça? 30/08/2012 03:29:07 Tri 30/08/2012 03:29:18 [10:28:21] Khone: Question: J'ai un pb: $ python manage.py schemamigration annuaire --initial Unknown command: 'schemamigration' Type 'manage.py help' for usage. davin.baragiotta 30/08/2012 03:29:39 ajoute south dans installed_apps de settings Tri 30/08/2012 03:29:40 [10:30:09] tran.xuan.huy: non, j'ai pb davin.baragiotta 30/08/2012 03:29:43 et sauvegade Tri 30/08/2012 03:29:48 [10:30:29] nguyen.le.duc.huy: meme problem de Khone davin.baragiotta 30/08/2012 03:30:07 quel est le probl de : tran.xuan.huy? Tri 30/08/2012 03:30:25 tran.xuan.huy: python manage.py schemamigration annuaire --initial Traceback (most recent call last): File "manage.py", line 4, in import settings # Assumed to be in the same directory. File "/net/nfs/home/server/txhuy/carto/settings.py", line 1 *# Django settings for carto project. ^ SyntaxError: invalid syntax davin.baragiotta 30/08/2012 03:31:20 enlever '*' sur première ligne de settings.py ok lisons ce qu'on a fait... 30/08/2012 03:32:25 la commande se lit ainsi : "fait la migration initiale du schéma des données de l'application annuaire" 30/08/2012 03:32:52 la migration... c'est du code Python qui va manipuler les tables 30/08/2012 03:33:03 voyons pour le fun où est la migration : 30/08/2012 03:33:12 cd annuaire 30/08/2012 03:33:15 ls 30/08/2012 03:33:17 on a un répertoire annuaire/migrations... 30/08/2012 03:33:37 avec un fichier : 001_initial.py 30/08/2012 03:33:48 ok 30/08/2012 03:33:51 maintenant... le code est "armé"... on va l'utiliser 30/08/2012 03:34:01 on va appliquer la migration 30/08/2012 03:34:07 avant... pour que south fonctionne bien (il note ce qu'il a fait dans des tables à lui) 30/08/2012 03:34:32 il faut créer les tables de south 30/08/2012 03:34:37 on fait de migration pour south... 30/08/2012 03:34:43 on crée directement les tables... 30/08/2012 03:34:48 (pas de migration car on versionne pas les tables de south : elles restent stables) 30/08/2012 03:35:03 ok : python manage.py syncdb 30/08/2012 03:35:09 oui 30/08/2012 03:35:25 créez un admin 30/08/2012 03:35:28 username : admin, pass : admin 30/08/2012 03:35:37 giotta@machina:~/projets/carto$ python manage.py syncdb Syncing... Creating tables ... Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_user_permissions Creating table auth_user_groups Creating table auth_user Creating table django_content_type Creating table django_session Creating table django_site Creating table south_migrationhistory You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'giotta'): admin E-mail address: admin@admin.org Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) Synced: > django.contrib.auth > django.contrib.contenttypes > django.contrib.sessions > django.contrib.sites > django.contrib.messages > django.contrib.staticfiles > south Not synced (use migrations): - annuaire (use ./manage.py migrate to migrate these) 30/08/2012 03:36:07 syncdb = commande normale de django pour créer tables... 30/08/2012 03:36:27 si on a pas south, dès qu'on modifie un modèle... faut supprimer table et recréer avec syncdb... c'est nul 30/08/2012 03:36:49 syncdb crée toutes les tables nécessaires sauf celles suivies par south : d'où le message à la fin 30/08/2012 03:37:12 Not synced (use migrations) 30/08/2012 03:37:23 maintenant que South a ses tables pour travaille,... utilisons la migration pour annuaire... 30/08/2012 03:37:41 go : python manage.py migrate annuaire 30/08/2012 03:37:56 en fait... le nom de l'app est facultatif 30/08/2012 03:38:04 giotta@machina:~/projets/carto$ python manage.py migrate annuaire Running migrations for annuaire: - Migrating forwards to 0001_initial. > annuaire:0001_initial - Loading initial data for annuaire. Installed 0 object(s) from 0 fixture(s) 30/08/2012 03:38:25 ahahaah! il a appliqué la migration codée dans 0001_initial : et elle reflète notre code actuel dans models.py! 30/08/2012 03:38:50 Tri 30/08/2012 03:38:58 [10:39:23] khuon.tiv: Q: Pourqoui migration pour south ? davin.baragiotta 30/08/2012 03:38:58 des questions aveant qu'on active l'admin? davin.baragiotta j'aide dans tech... pour les autres, vous pouvez relire le plan : 03:42 davin.baragiotta 30/08/2012 03:42:48 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support on est rendu à la partie 3 ; BACKEND 30/08/2012 03:43:00 thierry.tsitoara a quitté la salle 03:46 davin.baragiotta 30/08/2012 03:46:46 ok continuons... on veut maintenant gérer les données de nos modèles dans des interfaces web 30/08/2012 03:47:00 on va activer l,admin de Django 30/08/2012 03:47:05 c'est un plugin django 30/08/2012 03:47:43 sa doc : 30/08/2012 03:47:45 https://docs.djangoproject.com/en/1.4/ref/contrib/admin/ 30/08/2012 03:47:46 c'est LE plus gros vendeur de django 30/08/2012 03:47:56 s'agit de l,activé dans les settings.py : 30/08/2012 03:48:06 INSTALLED_APPS 30/08/2012 03:48:16 une ligne à décommenter 30/08/2012 03:48:35 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'annuaire', 'south', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) 30/08/2012 03:48:36 'django.contrib.admin', 30/08/2012 03:48:42 ensuite... on va modifier les urls pour que l'admin puisse gérer les URLS (requêtes HTTP) afin de créer des réponses 30/08/2012 03:49:39 urls.py : 30/08/2012 03:49:44 faut lire les commentaires et décommenter les trucs pour l,admin 30/08/2012 03:49:57 voir la page atelier pour les lignes décommentées 30/08/2012 03:50:09 carto/urls.py : from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'carto.views.home', name='home'), # url(r'^carto/', include('carto.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), ) 30/08/2012 03:50:51 voici mon fichier complet de urls.py 30/08/2012 03:50:59 maintenant... votre serveur devrait toujours rouler 30/08/2012 03:51:36 si c,est pas le cas : python manage.py runserver 30/08/2012 03:51:44 allez sur l'accueil pour le fun? 30/08/2012 03:51:51 erreur 404... 30/08/2012 03:52:00 on l,a tous? 30/08/2012 03:52:03 ok, un mot rapide sur urls.py 30/08/2012 03:52:23 c'est le point d'entrée de tout le projet 30/08/2012 03:52:33 TOUTES les requêtes sont dispatchées par urls.py 30/08/2012 03:52:46 il regarde le pattern de l'URL... et en fonction de l'URL... il fait exécuter le code responsable de répondre à cette requête 30/08/2012 03:53:15 donc 30/08/2012 03:53:17 si on regarde le code dans urls.py 30/08/2012 03:53:24 à part les import 30/08/2012 03:53:36 on n'a qu'un pattern : admin/ 30/08/2012 03:53:51 le string r'' = un string raw... en Python.... 30/08/2012 03:54:09 on l'utilise notamment pour les expressions régulières 30/08/2012 03:54:28 ^ = début d'un pattern de regex 30/08/2012 03:54:42 $ = fin 30/08/2012 03:54:45 r'^admin/' se lit 30/08/2012 03:54:55 toute URL qui (après le nom de domaine) commence exactement avec 'admin/' (peu importe ce qui suit... 30/08/2012 03:55:22 ... doit être traité par : 30/08/2012 03:55:27 include(admin.site.urls) 30/08/2012 03:55:34 les autres règles d'URLs de admin... 30/08/2012 03:55:45 bref 30/08/2012 03:55:47 ça commence avec admin? 30/08/2012 03:55:52 on passe la main à admin 30/08/2012 03:55:56 maintenant... on a fait quoi? 30/08/2012 03:56:01 on a appeler la page accueil du site... pas la page de l,admin 30/08/2012 03:56:12 essayez avec cette URL : 30/08/2012 03:56:17 http://127.0.0.1:8000/admin/ 30/08/2012 03:56:28 tadaaaaaaaaaaaaaaam!!!! 30/08/2012 03:56:32 utilisez les param de connexion de tout à l'heure 30/08/2012 03:56:45 admin/admin 30/08/2012 03:56:47 wow, on est dans l'admin! 30/08/2012 03:57:06 des erreurs? 30/08/2012 03:57:14 Tri 30/08/2012 03:57:38 [10:58:04] Khone: ok. davin.baragiotta 30/08/2012 03:57:41 (possible qu'il faille créer les tables de l'admin avec un syncdb : python manage.py syncdb) super 30/08/2012 03:57:44 Tri 30/08/2012 03:57:51 [10:58:33] khuon.tiv: Pas d'erreur pour moi davin.baragiotta 30/08/2012 03:57:53 bon... on voit des trucs dans l'admin mais 30/08/2012 03:57:54 rien qui ressemble à des Personnes ou des Etablissements 30/08/2012 03:58:03 et je le rappelle : c'est notre but ! 30/08/2012 03:58:13 gérer Personnes et Etablissements dans admin 30/08/2012 03:58:22 dernière étape : enregistrer nos modèles dans l'admin 30/08/2012 03:58:43 on va créer un fichier admin.py sous annuaire 30/08/2012 03:58:56 Tri 30/08/2012 03:59:07 [10:59:36] khuon.tiv: Q: '^admin/' n'est pas terminé par $. Pourquoi ? davin.baragiotta 30/08/2012 03:59:09 dans ce fichier, copiez le code de la page de l,atelier car si il termine avec $... tout ce qui ressemble à : admin/annuaire/personne/1/edit 30/08/2012 03:59:35 ne passera pas 30/08/2012 03:59:39 il ne respectera pas le pattern qui dirait "il doit commencer... et FINIR avec admin/ 30/08/2012 04:00:00 voilà 30/08/2012 04:00:05 créez admin.py sous annuaire 30/08/2012 04:00:11 annuaire/admin.py : from django.contrib import admin from annuaire.models import * admin.site.register(Etablissement) admin.site.register(Personne) 30/08/2012 04:00:39 ach... bien indenter 30/08/2012 04:00:45 from django.contrib import admin from annuaire.models import * admin.site.register(Etablissement) admin.site.register(Personne) 30/08/2012 04:01:01 voilà... c'est fait? 30/08/2012 04:01:08 faites seulement un refresh et on en discute 30/08/2012 04:01:18 ok j'ai dû relancer mon serveur pour voir une modification 30/08/2012 04:02:11 (pour que admin.py soit lu par l,admin) 30/08/2012 04:02:20 ehehe... voyez-vous les Etablissements et les Personnes? 30/08/2012 04:02:34 créons un Etablissement 30/08/2012 04:02:43 moi je crée UQAM à Montréal 30/08/2012 04:02:51 (lien Add) 30/08/2012 04:02:57 bon, minute... 30/08/2012 04:03:01 allons mettre cet admin en français (ou vietnamien? ) 30/08/2012 04:03:13 ou lao? 30/08/2012 04:03:20 ou khmer? 30/08/2012 04:03:28 settings.py 30/08/2012 04:03:31 LANGUAGE_CODE = 'fr-ca' 30/08/2012 04:03:46 relancer serveur 30/08/2012 04:03:56 (pas besoin, fallait juste sauvegarder) 30/08/2012 04:04:29 bon je suis en français 30/08/2012 04:04:33 et me reste 15 minutes 30/08/2012 04:04:42 Ajouter un établissement 30/08/2012 04:04:47 Enregistrer 30/08/2012 04:05:06 ach! 30/08/2012 04:05:08 erreur! 30/08/2012 04:05:11 no such table: django_admin_log 30/08/2012 04:05:16 me semblait bien qu'il manquait un syncdb pour les tables de l,admin.... 30/08/2012 04:05:31 go : python manage.py syncdb 30/08/2012 04:05:41 on voit : Creating table django_admin_log 30/08/2012 04:06:04 super 30/08/2012 04:06:05 refresh 30/08/2012 04:06:09 enregistrer 30/08/2012 04:06:27 ok... maintenant vous devriez voir un horrible 30/08/2012 04:06:35 "Etablissement object" 30/08/2012 04:06:43 ajoutez-en un 2e... 30/08/2012 04:06:48 maintenant on en voit 2.... 30/08/2012 04:07:10 pas clair de savoir quoi et quoi... 30/08/2012 04:07:19 on va faire une modif dans models.py 30/08/2012 04:07:32 pour mieux voir les objets... 30/08/2012 04:07:47 models.py : 30/08/2012 04:07:54 suivez la doc sur page atelier 30/08/2012 04:08:00 def __unicode__(self): return "" # coder ici la chaîne unicode désirée que l'on veut retourner 30/08/2012 04:08:35 indenter 30/08/2012 04:08:37 on ajoute une méthode unicode 30/08/2012 04:08:58 qui va donner une représentation en string de l'objet 30/08/2012 04:09:07 un peu comme un toString en Java 30/08/2012 04:09:14 def __unicode__(self): return "" 30/08/2012 04:09:24 le self en paramètre 30/08/2012 04:09:30 représente l'objet en question 30/08/2012 04:09:37 comme le "this" dans d'autres langages 30/08/2012 04:09:48 donc on n'a que le champ nom pour nos objets... 30/08/2012 04:09:59 on va retourner leur nom 30/08/2012 04:10:04 def __unicode__(self): return self.nom 30/08/2012 04:10:14 on fait pareil pour les 2 classes 30/08/2012 04:10:21 on refresh notre liste d'objets dans l,admin 30/08/2012 04:10:29 http://127.0.0.1:8000/admin/annuaire/etablissement/ 30/08/2012 04:11:23 aaaaaaaaaaaah! on y voit clair! 30/08/2012 04:11:29 ok, l'atelier tire à sa fin... des questions? 30/08/2012 04:11:41 après je fais un survol de ce qu'on n'a pas couvert 30/08/2012 04:11:50 questions? 30/08/2012 04:11:52 Tri 30/08/2012 04:12:14 pas de question! davin.baragiotta 30/08/2012 04:12:24 ben voyons... c'est clair à ce point? vous dormez? 30/08/2012 04:12:27 ok... je vous dis ce qu'on n,a pas fait dans le plan : 30/08/2012 04:12:37 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 30/08/2012 04:12:48 en huat de page... y,a le sommaire... 30/08/2012 04:13:01 on a terminé 4.1 30/08/2012 04:13:07 donc nous manque que 4.2 30/08/2012 04:13:13 (on peut le faire si vous voulez) 30/08/2012 04:13:21 mais je vous dit d'abord de quoi ça parle 30/08/2012 04:13:30 là on a atteint nos objectifs : 30/08/2012 04:13:54 on connait la structure d'un projet Django (même si on n'a pas utilisé le frontend) 30/08/2012 04:14:09 et surtout on sait gérer des données dans l'admin 30/08/2012 04:14:16 le gros du travail... c'était de la config... 30/08/2012 04:14:26 mais 30/08/2012 04:14:27 tran.xuan.huy a quitté la salle 04:14 davin.baragiotta 30/08/2012 04:14:44 la vrais puissance d'une app = dans ses modèles si on représente bien les Etablissements... si on les décrits bien 30/08/2012 04:14:57 Tri a quitté la salle 04:15 darasy.nong a quitté la salle 04:15 davin.baragiotta 30/08/2012 04:15:08 alors on pourra faire plein de trucs avec nos données... prochaines étapes prévues : c'était de mettre plus de champs utiles 30/08/2012 04:15:33 comme une date de naissance aux Personnes 30/08/2012 04:15:40 pour ça... faut lire la doc sur les Field types de Django 30/08/2012 04:15:57 on aurait découvert des DateField 30/08/2012 04:16:05 finalement... des données non reliées... c'est nul 30/08/2012 04:16:27 on aurait construit des relations entre nos données : 30/08/2012 04:16:37 lier des Personnes aux Etablissements pour dire que ce sont des "professeurs"... 30/08/2012 04:16:54 ça aussi dans Field type : ForeignKey 30/08/2012 04:17:07 tout ça... c'était pour avoir de meilleur modèles dans models.py 30/08/2012 04:17:32 et finalement... dans l,admin... : admin/ 30/08/2012 04:17:43 Tri a rejoint le salon 04:17 davin.baragiotta 30/08/2012 04:17:59 on peut faire plus de trucs que juste lister et ajouter/modifier/supprimer on peut faire de la recherche! 30/08/2012 04:18:05 on peut filtrer les résultats! 30/08/2012 04:18:14 tout ça... on le fait dans le fichier admin.py 30/08/2012 04:18:23 en suivant la doc de l'admin : 30/08/2012 04:18:31 https://docs.djangoproject.com/en/1.4/ref/contrib/admin/ 30/08/2012 04:18:40 donc 30/08/2012 04:18:41 tran.xuan.huy a rejoint le salon 04:19 davin.baragiotta 30/08/2012 04:19:05 avec la doc pour models.py : https://docs.djangoproject.com/en/1.4/ref/models/fields/ et la doc pour admin.py : https://docs.djangoproject.com/en/1.4/ref/contrib/admin/ 30/08/2012 04:19:18 vous êtes les rois du pétrole! 30/08/2012 04:19:25 ou du monde universitaire 30/08/2012 04:19:32 voilà ce qu'il nous restait à couvrir... les 2 heures sont écoulées (on a commencé à 02h20 GMT) 30/08/2012 04:19:52 des questions, remarques? 30/08/2012 04:20:00 des probl? 30/08/2012 04:20:03 Tri 30/08/2012 04:20:21 aucun davin.baragiotta 30/08/2012 04:20:36 ok.... si ça vous intéresse : demain on peut continuer avec Frontend je vais vous fournir un projet à jour 30/08/2012 04:20:42 avec des données dans carto.db 30/08/2012 04:20:50 Tri 30/08/2012 04:20:56 [11:21:27] khuon.tiv: Q: Problème STP davin.baragiotta 30/08/2012 04:20:57 on pourra se monter des interfaces à nous oui? 30/08/2012 04:21:03 Tri 30/08/2012 04:21:25 il a montre dans tech davin.baragiotta 30/08/2012 04:21:34 j'arrive Tri a quitté la salle 04:25 Tri a rejoint le salon 04:26 davin.baragiotta 30/08/2012 04:28:45 en CONCLUSION sur la page de l,atelier vous avez de l'info additionnelle sur communauté Django 30/08/2012 04:28:57 shafeek.sumser a quitté la salle 04:29 davin.baragiotta 30/08/2012 04:29:10 et autres notions à couvrir manage.py inspectdb, par exemple, est votre ami 30/08/2012 04:29:31 }}} ------------------ FIN ATELIER DJANGO : Architecture d'un projet et Backend (admin) -------------------------------- 30/08/2012 04:29:48 Tri 30/08/2012 04:30:22 merci Davin! khone-cc 30/08/2012 04:30:58 Parfait ... j'ai compris mieux mtn ..