ARCHIVE ATELIER DJANGO/BAKEND

   1 arnaud.amelina@auf.org 12:33:24
   2 ================================= Debut ATELIER Django : backend ====================================   
   3 jimmy.baroki a quitté le salon
   4 12:35:36
   5 
   6 davin.baragiotta 12:36:10
   7 Bonjour à tous,
   8 Encore une fois cette année... Django
   9 12:36:19
  10 Le matériel de présentation est celui de l'an passé :
  11 12:36:33
  12 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support
  13 12:36:49
  14 mais
  15 12:37:00
  16 comme on avait des difficultés avec les différentes versions de Django
  17 12:37:16
  18 (1.1.1 dispo sur Ubuntu 10.04)
  19 12:37:24
  20 on a une procédure pour
  21 12:37:34
  22 ENVIRONNEMENT TECHNIQUE
  23 12:37:38
  24 https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoBackend
  25 12:37:57
  26 on va se créer un environnement virtuel avec la version des paquets Python qu'il nous faut
  27 12:38:29
  28 quoi? vous n,avez pas suivi l,atelier virtualenv?
  29 12:38:39
  30 malheureux!
  31 12:38:43
  32 mais bonne nouvelle : vous pourrez participer à cet atelier
  33 12:38:55
  34 (mais vous ne comprendrez peut-être pas les premières étapes)
  35 12:39:10
  36 vous devriez maintenant avoir plusieurs fenêtres ouvertes :
  37 12:39:22
  38 * celle-ci
  39 12:39:25
  40 * la page web de présentation : on va la suivre en détail, c'est un atelier pratique ici
  41 12:39:43
  42 * un terminal ouvert
  43 12:39:49
  44 dans le terminal
  45 12:39:54
  46 suivez les étapes pour l'environnement technique
  47 12:40:05
  48 
  49 sudo apt-get install virtualenv
  50 12:40:29
  51 si vous ne l,aviez pas déjà
  52 12:40:37
  53 créer un répertoire pour les ateliers Django :
  54 mkdir
  55 12:41:00
  56 (faites ça dans votre home)
  57 12:41:06
  58 
  59 ~$ mkdir django
  60 12:41:17
  61 allez y
  62 12:41:21
  63 cd django
  64 12:41:24
  65 maintenant on crée un environnement virtuel pour avoir les versions qu'on veut *en local*
  66 12:41:49
  67 on va pouvoir travailler avec Django 1.4.6, dispo dans Wheezy... même si on est sur une Ubuntu 10.04
  68 12:42:10
  69 (qui lui offre Django 1.1.1)
  70 12:42:21
  71 
  72 ~$ virtualenv atelier
  73 12:42:32
  74 activons l'environnement virtuel
  75 12:42:42
  76 
  77 ~$ source atelier/bin/activate
  78 12:42:54
  79 maintenant, le prompt montre qu'on est dans le contexte de l,environnement virtuel de l'atelier :
  80 (atelier)~$
  81 12:43:29
  82 ritesh.dhora a quitté le salon
  83 12:43:53
  84 
  85 davin.baragiotta 12:43:54
  86 installer Django et South, avec les versions dispo dans Wheezy :
  87 
  88 (atelier)~$ pip install Django==1.4.6
  89 (atelier)~$ pip install south==0.7.6
  90 12:44:19
  91 Django 7.7 Mb
  92 12:45:37
  93 jimmy.baroki a rejoint le salon
  94 12:46:29
  95 
  96 davin.baragiotta 12:46:34
  97 South 91kb O.o
  98 ok
  99 12:46:38
 100 maintenant... toujours dans notre environnement
 101 12:46:46
 102 on va lancer notre interpréteur
 103 12:46:58
 104 interpréteur Python
 105 12:47:15
 106 moi j'utilise ipython
 107 12:47:24
 108 
 109 (atelier)~$ ipython
 110 12:47:31
 111 dans l'interpréteur... importez Django (hey, on code en Python là!)
 112 12:47:50
 113 
 114 import django
 115 12:47:54
 116 bon ça marche pas avec mon ipython
 117 12:48:42
 118 donc
 119 12:48:43
 120 utilisez python
 121 12:48:48
 122 
 123 (atelier)~$ python
 124 12:48:56
 125 (désolé)
 126 12:49:05
 127 
 128 >>> import django
 129 12:49:16
 130 il ne devrait pas y avoir d'erreur
 131 12:49:25
 132 toujours dans interpréteur... tester la version de Django
 133 12:49:42
 134 
 135 >>> django.get_version()
 136 12:49:54
 137 si vous n'avez pas '1.4.6'.... on arrête tout!
 138 12:50:25
 139 tout le monde a bien 1.4.6?
 140 12:50:37
 141 ok, si c'est juste moi et progfou qui suivent, je retourne me coucher ;)
 142 12:52:27
 143 brice.ondjibou a rejoint le salon
 144 12:52:39
 145 claudine.mosozi a quitté le salon
 146 12:53:00
 147 claudine.mosozi a rejoint le salon
 148 12:53:14
 149 
 150 progfou 12:53:19
 151 à mon avis il faut attendre un peu le chargement des 7,7 Mio chez les autres… mine de rien ça peut prendre plusieurs minutes sur des liaisons bien occupées…    
 152 
 153 kazuhiro.oguchi 12:55:02
 154 question un peu hors sujet, sur ipython il trouve pas le module django mais dans python oui. une conf a faire quelques pars ?   
 155 
 156 davin.baragiotta 12:55:41
 157 kazuhiro.oguchi: en fait...
 158 quand j'ai lancé ipython... il utilisait le ipython de mon système... et de mon système... il ne voyait pas ce que j'avais installé dans mon environnement local
 159 12:56:11
 160 voilà
 161 12:56:14
 162 python, lui... est installé lors de la création du venv
 163 12:56:36
 164 preuve : atelier/bin/
 165 12:56:45
 166 progfou: ok on attend
 167 12:57:14
 168  
 169 progfou 12:57:58
 170 une erreur pendant l'installation pour Claudine 
 171 
 172 davin.baragiotta 12:58:37
 173 ok, j'attends... encore un peu
 174 à ce point-ci, vous devriez avoir Django 1.4.6
 175 13:00:19
 176 pour le reste des commandes, je ne vais pas écrire le venv devant le prompt... mais assurez-vous d'avoir 
 177 (atelier)~$
 178 13:00:53
 179 INTRODUCTION
 180 13:00:56
 181 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support
 182 13:01:14
 183 Nous sommes maintenant entré dans l'univers du développement d'application web (avec Python)
 184 13:01:51
 185 Django est un framework qui nous permet d'aller plus vite... et de ne pas réinventer la roue
 186 13:02:16
 187 les problèmes récurrents ont déja`leur solution dans Django
 188 13:02:38
 189 d'abord... la documentation
 190 13:02:49
 191 Django est très bien documenté.
 192 13:03:01
 193 car ça fait parti du projet : un release doit avoir la doc à jour
 194 13:03:16
 195 quand vous allez sur le site de django et que vous cliquez sur doc.... assurez-vous de choisir la bonne version en bas à droite
 196 13:03:42
 197 donc 1.4 pour nous
 198 13:03:47
 199 https://docs.djangoproject.com/en/1.4/
 200 13:03:59
 201 aussi, il y a un tutoriel
 202 13:04:27
 203 accessible en haut de la doc
 204 13:04:32
 205 les 2 ateliers Django de la Semaine Tech couvrent ce tutoriel (presqu'en totalité, avec exemple AUFien)
 206 13:05:02
 207 pour finir l'intro : 
 208 13:05:25
 209 c'est important de coder notre projet dans une version de Django disponible sur nos serveurs
 210 13:05:43
 211 notre objectif aujourd'hui :
 212 13:06:07
 213 * comprendre l,architecture d'un projet django (quoi fait quoi)
 214 13:06:18
 215 * gérer des données dans l'admin de django
 216 13:06:27
 217 PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET
 218 13:06:29
 219 http://montrealpython.org/r/attachments/13/web-development.jpg
 220 13:06:47
 221 petit schéma sympa
 222 13:06:55
 223 pour savoir où on se trouve quand on fait du développement web
 224 13:07:11
 225 nous, on code en Python pour une app côté serveur... qui va répondre à une requête HTTP... en envoyant une réponse HTTP avant pour contenu (généralement) du HTML
 226 13:07:54
 227 voilà tout
 228 13:07:58
 229 actuellement, dans cet atelier
 230 13:08:24
 231 on va coder en local... l'environnement de développement est sur notre machine
 232 13:08:52
 233 DEV
 234 13:08:56
 235 Django offre un serveur local quand on est en mode de développement
 236 13:09:11
 237 il existe d'autres framework de développement web Python, notamment Pyramid, mais je passe sur les détails
 238 13:09:41
 239 (on en parle après si vous voulez)
 240 13:09:50
 241 un avantage de Django = tout-en-un et son interface admin qu'on va expérimenter dans quelques instants
 242 13:10:16
 243 Les principaux fichiers impliqués sont représentés sur le schéma... mais on les verra en détail, un par un
 244 13:10:54
 245 on est sur le point maintenant de créer notre projet Django
 246 13:11:08
 247 tout le monde suit?
 248 13:11:11
 249 dj6mplo a rejoint le salon
 250 13:12:14
 251 yemen.sayour a quitté le salon
 252 13:12:17
 253 mclaude a rejoint le salon
 254 13:16:05
 255 
 256 davin.baragiotta 13:17:00
 257 bon jusqu'à maintenant... on n'a rien fait du point de vu Django
 258 donnons-nous un projet... 
 259 13:17:17
 260 lisez dans le doc de présentation
 261 13:17:26
 262 PARTIE 2 : PROJET ET APPLICATIONS
 263 13:17:40
 264 L'AUF vous dit "hey, on veut cartographier nos membres"
 265 13:18:01
 266 vous dites "quoi? qu'est-ce à dire?"
 267 13:18:18
 268 on vous explique qu'on veut savoir quels professeurs sont dans quels établissements...
 269 13:18:47
 270 quels formations sont données par les établissements
 271 13:18:55
 272 quels sont les labos, etc.
 273 13:19:02
 274 donc vous vous asseyiez... et modélisez
 275 13:19:12
 276 bingo... vous vous dites que 4 modèles feront le boulot
 277 13:19:29
 278 on va commencer par 2 :
 279 13:19:38
 280 Etablissement
 281 13:19:41
 282 Personne
 283 13:19:43
 284 l'idée étant que des Personnes seront rattachées à des Établissements (en tant que professeurs... par exemple, mais ça pourrait être autre chose)
 285 13:20:14
 286 il faut comprendre ça : car c,est le projet
 287 13:20:24
 288 bertille.lekeufack@jabber.org a quitté le salon
 289 13:20:35
 290 
 291 davin.baragiotta 13:20:43
 292 aujourd'hui on va gérer CES données dans l,admin
 293 le projet c'est la cartographie... on va l'appeler carto
 294 13:20:58
 295 dans votre ligne de commande... avec interpréteur Python lancé dans le contexte virtuel "atelier"
 296 13:21:31
 297 lancez ceci :
 298 13:21:40
 299 en fait... quittez Python
 300 13:21:53
 301 
 302 exit()
 303 13:21:57
 304 et tapez ceci :
 305 (atelier)~$ django-admin.py startproject carto
 306 13:23:31
 307 (le script django-admin.py = la porte d'entrée de Django... au début...)
 308 13:24:08
 309  
 310 progfou 13:24:27
 311 ‎[09:23:59] ‎ongolaBoy‎: Q: django-admin == django-admin.py ??  
 312 
 313 davin.baragiotta 13:24:28
 314 regardez l,arborescence des fichiers sous django
 315 ongolaBoy: sur Mac faut pas le .py, je crois...
 316 13:24:48
 317 et là j'ai essayé ceci :
 318 python django-admin.py startproject carto
 319 13:24:57
 320 et ça marche pas avec python devant...
 321 13:25:03
 322 c'est pénible
 323 13:25:07
 324 mais avec ce que j'ai mis plus haut : tout devrait marcher
 325 13:25:20
 326  
 327 progfou 13:25:20
 328 ‎[09:24:41] ‎sekou.diall‎: Question : on la cmd django-admin.py startproject carto dans le dossier django précedement crée ?    
 329 
 330 davin.baragiotta 13:25:25
 331 
 332 (atelier)~$ django-admin.py startproject carto
 333 oui, dans le django précédamment créé
 334 13:25:38
 335 et plus que ça
 336 13:25:42
 337 avec (atelier)~$ activé
 338 13:25:57
 339 ah je devrais donc écrire ceci :
 340 13:26:04
 341 
 342 (atelier)~/django$ django-admin.py startproject carto
 343 13:26:31
 344 ok, à partir de maintenant... TOUT est TOUJOURS dans :
 345 (atelier)~/django$
 346 13:27:03
 347 je vais juste écrire $
 348 13:27:16
 349 on me sui un peu?
 350 13:27:24
 351 nous reste une heure là...
 352 13:27:29
 353  
 354 progfou 13:28:13
 355 quelques un(e)s encore bloqué sur la fin de la mise en place de virtualenv + django, mais ça va venir   
 356 
 357 davin.baragiotta 13:28:29
 358 bon, alors regardez les fichiers créés dans le répertoire carto
 359 on voit manage.py
 360 13:28:59
 361 et un autre répertoire carto
 362 13:29:09
 363 manage.py représente maintenant Django...
 364 13:29:17
 365 on ne parlera qu'à lui
 366 13:29:22
 367 (plus à django-admin.py)
 368 13:29:29
 369 regardons maintenant le contenu de carto/carto/
 370 13:29:42
 371 4 fichiers :
 372 * __init__.py
 373 13:29:59
 374 
 375 * settings.py
 376 * urls.py
 377 * wsgi.py
 378 13:30:14
 379 commentaire un par un
 380 13:30:21
 381 __init__.py : dans ton répertoire où il y a ce type de fichier... ce répertoire est une "module python"
 382 13:30:49
 383 ça permet de faire des import
 384 13:30:59
 385 donc c'est possible de coder dans nos scripts :
 386 import carto
 387 13:31:14
 388 c'est tout, on fait rien avec __init__
 389 13:31:27
 390 settings... comme son nom l'indique... c,est la config
 391 13:31:37
 392 fred-juvenal.namsionou a quitté le salon
 393 13:31:49
 394 
 395 davin.baragiotta 13:32:00
 396 on va y revenir au besoin
 397 * wsgi.py : sert juste pour déploiement en PROD... on touche pas
 398 13:32:15
 399 * urls.py : ça c'est notre porte d'entrée pour notre app
 400 13:32:38
 401 toute requête passe par là au début
 402 13:32:50
 403 urls.py = dispatcher... en fonction du patron d'URL, il assigne la fonction qui va retourne la réponse
 404 13:33:19
 405 fred-juvenal.namsionou a rejoint le salon
 406 13:33:21
 407 
 408 davin.baragiotta 13:33:22
 409 on y revient    
 410 eric.mcsween a rejoint le salon
 411 13:33:26
 412 
 413 davin.baragiotta 13:33:29
 414 bieeeeeeen! on a un projet      
 415 
 416 progfou 13:33:39
 417 ‎[09:33:29] ‎ongolaBoy‎: Q: settings.py est placé dans .gitignore pour nos projets ?    
 418 
 419 davin.baragiotta 13:33:45
 420 la commande "startproject" n'a rien fait d,autre que de créer ces fichiers à notre place
 421 ongolaBoy: non... on doit suivre les settings
 422 13:33:59
 423 mais
 424 13:34:00
 425 on ne veut pas suivre certains params de config
 426 13:34:09
 427 comme les paramètres d'accès à la base de données
 428 13:34:21
 429 donc ces paramètres là seront extraits de settings.py...
 430 13:34:33
 431 pour être mis dans un conf.py
 432 13:34:39
 433 qui LUI sera ignoré par git
 434 13:34:46
 435 (et importé par settings.py... pour que la config reste accessible à Django)
 436 13:35:07
 437 ok, on n,a toujours pas fait grand chose : juste créé la strucutre de départ du projet
 438 13:35:22
 439 questions?
 440 13:35:25
 441 on continue
 442 13:35:55
 443  
 444 progfou 13:35:57
 445 pas pour le moment
 446 ‎[09:36:03] ‎sekou.diall‎: Question : On peut dire  urls.py  jour  le rôle de  controleur ( MVC ) pour le framework Django ?
 447 13:36:08
 448  
 449 davin.baragiotta 13:36:25
 450 en partie, oui... avec les views.py
 451 (voir le schéma... je crois que j'avais mis MVC à coté des fichiers)
 452 13:36:42
 453 (ou views n'est pas V de MVC... ce sont les templates qui sont le V)
 454 13:37:11
 455 ok maintenant, lançons le serveur de développement
 456 13:37:35
 457 pour qu'on nous "serve" notre nouveau projet dans un browser!!! :D
 458 13:37:52
 459 allez dans le répertoire carto/ (le premier)
 460 13:38:26
 461 django/carto/
 462 13:38:30
 463 
 464 (atelier)~/django/carto/$ python manage.py runserver
 465 13:39:19
 466 Django nous dit qu'il sert l'application à http://127.0.0.1:8000
 467 13:39:54
 468 allons y avec browser
 469 13:40:02
 470 (navigateur web :) )
 471 13:40:15
 472 super!!!!
 473 13:40:24
 474 It works!
 475 13:40:27
 476 On a un site Django! Hourra!
 477 13:40:34
 478 mais bon, comme le dit le message... on a encore rien fait ;)
 479 13:40:45
 480 lisons les étapes
 481 13:40:54
 482 si tu veux une base de données... modifie la config DATABASES dans settings
 483 13:41:17
 484 bien sûr qu'on en veut une... comment stocker les Etablissements et Personnes sinon
 485 13:41:33
 486 (oui y,a d'autres moyen... mais on veut une DB SQL)
 487 13:41:59
 488 alors éditer settings.py
 489 13:42:12
 490 on a ça par défaut : 
 491 DATABASES = {
 492     'default': {
 493         'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
 494         'NAME': '',                      # Or path to database file if using sqlite3.
 495         'USER': '',                      # Not used with sqlite3.
 496         'PASSWORD': '',                  # Not used with sqlite3.
 497         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
 498         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
 499     }
 500 }
 501 13:42:47
 502 on va utiliser une DB SQLite... car on a tout ce qu'il faut en Python, dans la standard library pour travailler avec sqlilte
 503 13:43:29
 504 (pas besoin d'installer les pilotes pour MySQl, par ex)
 505 13:43:44
 506 mais dans la vraie vie... sqlite n'est pas vraiment recommandé pour PROD
 507 13:43:58
 508 on prendra MySQL ou Postgresql (alors faudra les pilotes Python pour parler avec)
 509 13:44:18
 510 alors, en lisant les commentaires
 511 13:44:25
 512 on devrait avoir ceci au final :
 513 DATABASES = {
 514     'default': {
 515         'ENGINE': 'django.db.backends.sqlite2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
 516         'NAME': 'carto.db',                      # Or path to database file if using sqlite3.
 517         'USER': '',                      # Not used with sqlite3.
 518         'PASSWORD': '',                  # Not used with sqlite3.
 519         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
 520         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
 521     }
 522 }
 523 13:44:53
 524 en gros, ENGINE et NAME modifié
 525 13:45:02
 526 je vous laisse éditer et sauvegarder
 527 13:45:10
 528  
 529 progfou 13:45:27
 530 ‎[09:45:23] ‎progfou‎: Q: pourquoi sqlite2 et pas sqlite3 comme proposé ?       
 531 
 532 davin.baragiotta 13:45:35
 533 oui... 3... je dors
 534 donc :
 535 DATABASES = {
 536     'default': {
 537         'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
 538         'NAME': 'carto.db',                      # Or path to database file if using sqlite3.
 539         'USER': '',                      # Not used with sqlite3.
 540         'PASSWORD': '',                  # Not used with sqlite3.
 541         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
 542         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
 543     }
 544 }
 545 13:45:54
 546 ok?
 547 13:46:09
 548 bon, si on se rappelle le message sur notre page web par defaut... outre settings...
 549 13:46:47
 550 il nous dit de créer une "application"
 551 13:46:57
 552 alors, qu'est-ce qu'une application
 553 13:47:08
 554 disons que c'est un "regroupement de trucs" qui sont reliés...
 555 13:47:26
 556 dans le génie logiciel, on cherche à éviter des dépendances entre chose pas reliées
 557 13:47:52
 558 donc on peut se dire qu'on va se créer une application "annuaire"
 559 13:48:09
 560 dans beaucoup de projet, on voit une application "core" qui sont but et de gérer les notions centrales du projet
 561 13:48:30
 562 je ne veux pas débattre ici du terme à choisir... même si dans un vrai projet ce serait le moment
 563 13:48:51
 564 appelons notre première application du projet "annuaire"... 
 565 13:49:03
 566 on pourrait penser à une application future "recherche" pour gérer tous les aspects de la recherche scientifique d'un établissement
 567 13:49:29
 568 alors créons annuaire (comme dans le document de présentation)
 569 13:49:45
 570 la commande est "startapp"...
 571 13:49:54
 572 on a vu "stratproject"... là on start une app
 573 13:50:04
 574 
 575 (atelier)~django/carto$ python manage.py startapp annuaire
 576 13:50:37
 577 ah... aussi... vous pouvez "laisser votre serveur rouler"
 578 13:50:52
 579 et ouvrir un autre onglet
 580 13:50:57
 581 assurez-vous que l'environnement virtuel est bien là (atelier)
 582 13:51:15
 583 pour mémoire, on l,acgtive avec :
 584 source atelier/bin/activate
 585 13:51:36
 586 (évidemment, mettre les bons path... atelier/ et carto/ sont les 2 sous django/ )
 587 13:51:56
 588  
 589 progfou 13:52:00
 590 je leur fais un résumé des commandes régulièrement ;-)  
 591 
 592 davin.baragiotta 13:52:06
 593 j'ai vu, merci
 594 car au final on fait pas grand chose... le challenge = comprendre ce qui se passe
 595 13:52:22
 596  
 597 progfou 13:52:46
 598 ‎[09:52:39] ‎ongolaBoy‎: Q: Il faut s'assurer dêtre dans l'environnement virtuel quand on veut exécuter une commande n'est-ce pas ? Si on souhaite modifier des fichiers, on peut être en dehors je suppose ?   
 599 
 600 davin.baragiotta 13:53:44
 601 oui... modifier fichier on fait comme on veut
 602 moi je suis en mode graphique : nautilus + gedit... il ne connaisse pas mon environnement virtuel Python
 603 13:54:04
 604 équivalent en ligne de commande = direct ls et vi, emacs...
 605 13:54:20
 606 (environnement activé ou pas)
 607 13:54:29
 608 venv : impacte juste l'univers Python en disant quel module Python prendre où
 609 13:54:50
 610 
 611 giotta@machina:~/django/carto$ cd ..
 612 giotta@machina:~/django$ source atelier/bin/activate
 613 (atelier)giotta@machina:~/django$ cd carto
 614 (atelier)giotta@machina:~/django/carto$ python manage.py startapp annuaire
 615 13:55:02
 616 hourra! on a une première app!
 617 13:55:12
 618 ok, on regarde ce que ça a fait
 619 13:55:41
 620 ça a créé un répertoire annuaire
 621 13:55:46
 622 regardons son contenu
 623 13:55:52
 624 le répertoire est à côté de carto
 625 13:56:14
 626 django/carto/annuaire
 627 13:56:24
 628 ça là que tout le reste des fichiers résident... ceux qui vont faire le boulot pour retourner une réponse HTTP (HTML/CSS, etc.) à la requête web reçue
 629 13:57:10
 630 carto/carto/urls.py va dispatcher à une fonction de carto/annuaire/views.py
 631 13:57:41
 632 views.py = les fonctions qui codent la logique de traitement
 633 13:57:53
 634 ex.: tu veux voir la liste des Établissements? voici le traitement informatique pour l'obtenir
 635 13:58:13
 636 (on verra plus en détail dans atelier Frontend)
 637 13:58:21
 638 test.py : c,est pour écrire suite de test...
 639 13:58:35
 640 on le fera pas
 641 13:58:38
 642 mais faudrait dans atelier Frontend ;)
 643 13:58:48
 644 __init__.py : même rôle que l'autre... c'est une convention Python pour créer un module
 645 13:59:06
 646 on peut donc faire :
 647 import annuaire
 648 13:59:14
 649 ou mieux :
 650 import carto.annuaire
 651 13:59:24
 652 voilà
 653 13:59:29
 654 reste donc models.py
 655 13:59:34
 656 c'est là qu'on va coder la modélisation qu'on a faite
 657 13:59:44
 658 on avait dit quoi?
 659 13:59:48
 660 ah oui... on a modélisé des Établissements et des Personnes...
 661 13:59:58
 662 sans plus tarder... codons
 663 14:00:24
 664 éditer le fichier models.py
 665 14:00:31
 666 on a déjà :
 667 from django.db import models
 668 
 669 # Create your models here.
 670 14:00:59
 671 mais comment créer les modèles?
 672 14:01:09
 673 victor.bruneau a quitté le salon
 674 14:01:10
 675 
 676 davin.baragiotta 14:01:18
 677 comment les coder?
 678 suivez la doc pour apprendre... moi je ne fais que vous guider rapidement
 679 14:01:34
 680 doc django :
 681 14:01:39
 682 https://docs.djangoproject.com/en/1.4/
 683 14:01:53
 684 (attentino à la version)
 685 14:01:58
 686 ok, sur accueil... on voit direct "model layer"
 687 14:02:10
 688 ahaha facile!
 689 14:02:13
 690 on veut les écrire... "model syntax"
 691 14:02:25
 692 super!
 693 14:02:26
 694 victor.bruneau a rejoint le salon
 695 14:02:31
 696 
 697 davin.baragiotta 14:02:59
 698 je vous dispense de lire tout ça... mais ça fait 20 pages imprimées... ça se lit bien (pour peu qu'on lise l'anglais technique)
 699 alors voici en résumé :
 700 14:03:10
 701 un modèle, c'est une class Python
 702 14:03:19
 703 mais
 704 14:03:23
 705 pour avoir la magie de Django... on va la faire hériter d'un modèle type de django
 706 14:03:47
 707 
 708 class Etablissement(models.Model):
 709     pass
 710 14:04:16
 711 idem pour Personne
 712 14:04:23
 713 conventions : noms de classe en CamelCase
 714 14:04:34
 715 (singulier aussi)
 716 14:04:41
 717 pour ceux que ça intéresse, je code les modèles ici en live :
 718 14:06:14
 719 https://coderpad.io/771405
 720 14:06:15
 721 ça donne ça :
 722 from django.db import models
 723 
 724 class Etablissement(models.Model):
 725     pass
 726   
 727 class Personne(models.Model):
 728     pass
 729 14:07:10
 730 maintenant... on va ajouter des champs à ces modèles...
 731 14:07:42
 732 quelle info pour un établissement?
 733 14:07:52
 734 hmm... au moins un nom... un sigle aussi tiens
 735 14:08:07
 736 ajoutons ça
 737 14:08:10
 738 mais comment coder des champs?
 739 14:08:18
 740 documentation : accueil, sous model layer
 741 14:08:25
 742 field types... parfait!
 743 14:08:37
 744 https://docs.djangoproject.com/en/1.4/ref/models/fields/
 745 14:09:00
 746 on voit dans colonne de droite, sous field types, tous les types de champs qui existent dans Django
 747 14:09:25
 748 un nom... ça pourrait être quoi?
 749 14:09:31
 750 ah, CharField, cool
 751 14:09:38
 752 parfait pour sigle en fait...
 753 14:09:42
 754 commençons avec ça
 755 14:09:47
 756 bertille.lekeufack a rejoint le salon
 757 14:09:48
 758 
 759 davin.baragiotta 14:09:52
 760 je code dans le pad live
 761 si on lit la doc de CharField...
 762 14:10:35
 763 on voit qu'un param est obligatoire : la longueur de caractères
 764 14:10:49
 765 max_length
 766 14:10:52
 767 une personne aura un nom...
 768 14:11:29
 769 un prénom aussi tiens
 770 14:11:36
 771 ok, ajoutons une date de naissance à une personne...
 772 14:12:06
 773 quel champ?
 774 14:12:09
 775 voir la doc
 776 14:12:11
 777 colonne de droite
 778 14:12:14
 779 DateField (on n,a pas beosin de l'heure)
 780 14:12:51
 781 hop, on code... (y,a des params obligatoires pour ça? apparemment pas)
 782 14:13:16
 783 ça donne ceci :
 784 from django.db import models
 785 
 786 class Etablissement(models.Model):
 787     nom = models.CharField(max_length=255)
 788     sigle = models.CharField(max_length=255)
 789   
 790 class Personne(models.Model):
 791     nom = models.CharField(max_length=255)
 792     prenom = models.CharField(max_length=255)
 793     date_naissance = models.DateField()
 794 14:13:48
 795 sauvegarder le fichier
 796 14:13:56
 797 ok des questions sur comment coder un modèle?
 798 14:14:19
 799 (ou autre)
 800 14:14:24
 801 ok on va terminer le travail sur notre app
 802 14:15:02
 803 en "installant" l'app dans le projet
 804 14:15:10
 805 (oui, ç'aurait été mieux que Django le fasse pour nous ;) )
 806 14:15:23
 807 dans le fihciher settings (éditer)
 808 14:15:30
 809 dans le param INSTALLED_APPS
 810 14:15:39
 811 ajouter la ligne :
 812 'annuaire',
 813 14:15:47
 814 
 815 INSTALLED_APPS = (
 816     'django.contrib.auth',
 817     'django.contrib.contenttypes',
 818     'django.contrib.sessions',
 819     'django.contrib.sites',
 820     'django.contrib.messages',
 821     'django.contrib.staticfiles',
 822     # Uncomment the next line to enable the admin:
 823     # 'django.contrib.admin',
 824     # Uncomment the next line to enable admin documentation:
 825     # 'django.contrib.admindocs',
 826     'annuaire',
 827 )
 828 14:16:40
 829 save
 830 14:16:47
 831 bon, alors notre app est presque prête...
 832 14:17:02
 833  
 834 progfou 14:17:10
 835 ‎[10:17:05] ‎progfou‎: Q: c'est 'annuaire' ou 'carto.annuaire' ? lequel est officiellement recommandé ? 
 836 
 837 davin.baragiotta 14:17:20
 838 carto.annuaire
 839 non ambigu
 840 14:17:28
 841 ok, atteint un objectif : comprendre les fichiers d'un projet
 842 14:18:00
 843 on veut maintenant gérer les données dans l'admin
 844 14:18:11
 845 on va donc "activer" l'admin
 846 14:18:19
 847 PARTIE 3 : BACKEND (ADMIN)
 848 14:18:33
 849 dans carto/urls.py
 850 14:18:39
 851 décommenter les lignes de l'admin
 852 14:18:49
 853 ĉa donne ça :
 854 from django.conf.urls import patterns, include, url
 855 
 856 # Uncomment the next two lines to enable the admin:
 857 from django.contrib import admin
 858 admin.autodiscover()
 859 
 860 urlpatterns = patterns('',
 861     # Examples:
 862     # url(r'^$', 'carto.views.home', name='home'),
 863     # url(r'^carto/', include('carto.foo.urls')),
 864 
 865     # Uncomment the admin/doc line below to enable admin documentation:
 866     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
 867 
 868     # Uncomment the next line to enable the admin:
 869     url(r'^admin/', include(admin.site.urls)),
 870 )
 871 14:19:24
 872 là l'urls est prêt à dispatcher tout derrière /admin/ vers (une views?) de l'admin Django...
 873 14:19:59
 874 ... mais l'app admin est pas installé je crois ;)
 875 14:20:07
 876 carto/settings.py
 877 14:20:14
 878 INSTALLED_APPS
 879 14:20:18
 880 décommenter admin
 881 14:20:22
 882 
 883 INSTALLED_APPS = (
 884     'django.contrib.auth',
 885     'django.contrib.contenttypes',
 886     'django.contrib.sessions',
 887     'django.contrib.sites',
 888     'django.contrib.messages',
 889     'django.contrib.staticfiles',
 890     # Uncomment the next line to enable the admin:
 891     'django.contrib.admin',
 892     # Uncomment the next line to enable admin documentation:
 893     # 'django.contrib.admindocs',
 894     'annuaire',
 895 )
 896 14:20:42
 897 (admindocs pas important)
 898 14:20:49
 899 voilà... l,admin est activé... notre app aussi...
 900 14:21:02
 901 mais lions maintenant nos modèles à l'admin
 902 14:21:12
 903 on veut dire ceci : "hey... ce modèle peut être géré dans l'admin"
 904 14:21:26
 905 on se crée un fichier admin dans notre app :
 906 14:21:37
 907 annuaire/admin.py
 908 14:21:44
 909 quoi y mettre ?
 910 14:22:15
 911 lire la doc de l,admin sur le web :
 912 14:22:21
 913 sur accueil, sous "other batteries included"
 914 14:22:59
 915 Admin site
 916 14:23:03
 917 https://docs.djangoproject.com/en/1.4/ref/contrib/admin/
 918 14:23:12
 919 je vous donne donc en live ce qu'il faut coder
 920 14:23:25
 921 https://coderpad.io/771405
 922 14:23:38
 923 on veut juste enregistrer nos modèles dans l,admin
 924 14:25:03
 925 c'est presque pas du code là... on configure!
 926 14:25:13
 927 
 928 from django.contrib import admin
 929 from carto.annuaire.models import Etablissement, Personne
 930 
 931 admin.site.register(Etablissement)
 932 admin.site.register(Personne)
 933 14:26:02
 934 voila
 935 14:26:07
 936 save
 937 14:26:08
 938 ok on devrait avoir tout
 939 14:26:12
 940 allons voir ce qui se passe sur l'accueil (le serveur doit toujours rouler)
 941 14:26:24
 942 http://127.0.0.1:8000/
 943 14:26:37
 944 refresh
 945 14:26:40
 946 ach!
 947 14:26:52
 948  
 949 progfou 14:26:55
 950 (non, on avait faire un ctrl+c ;-) ) RAPPEL : lancer python manage.py runserver 
 951 
 952 davin.baragiotta 14:26:58
 953 il dit 404...
 954 
 955 (atelier)~/django/carto/$ python manage.py runserver
 956 14:27:36
 957 ok donc on a 404
 958 14:27:51
 959 pourquoi?
 960 14:27:54
 961 si on se souvient... le point d'entrée, c'est urls.py
 962 14:28:06
 963 ce sont les règles (patrons) d'URL géré...
 964 14:28:16
 965 on a quoi comme règle
 966 14:28:22
 967 regardons
 968 14:28:28
 969 from django.conf.urls import patterns, include, url
 970 
 971 # Uncomment the next two lines to enable the admin:
 972 from django.contrib import admin
 973 admin.autodiscover()
 974 
 975 urlpatterns = patterns('',
 976     # Examples:
 977     # url(r'^$', 'carto.views.home', name='home'),
 978     # url(r'^carto/', include('carto.foo.urls')),
 979 
 980     # Uncomment the admin/doc line below to enable admin documentation:
 981     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
 982 
 983     # Uncomment the next line to enable the admin:
 984     url(r'^admin/', include(admin.site.urls)),
 985 )
 986 14:28:37
 987 seulement "admin/"
 988 14:28:46
 989 (les r'' = string raw)
 990 14:29:06
 991 ^ = regex, début obligatoire de l'expression
 992 14:29:23
 993 je passe détail regex : voir la doc Python officielle au besoin, dans standard library, module re
 994 14:29:46
 995 ok donc
 996 14:29:49
 997 on gère admin
 998 14:29:58
 999 donc, on va mettre dans l'URL... /admin
1000 14:30:06
1001 http://127.0.0.1:8000/admin/
1002 14:30:29
1003 autre erreur : on n,a pas les tables qu'ils faut dans l,admin
1004 14:30:43
1005 alors dernière opération (normale)...
1006 14:30:54
1007 syncrhoniser la DB avec les modèles nécessaires pour les apps
1008 14:31:13
1009 (la nôtre, annuaire... mais aussi celle de l'admin)
1010 14:31:23
1011 
1012 (atelier)~django/carto$ python manage.py syncdb
1013 14:31:40
1014 oui, créez un user admin bidon
1015 14:31:51
1016 user : admin
1017 14:31:53
1018 mdp : admin
1019 14:31:55
1020 courriel (n'importe)
1021 14:32:03
1022 http://127.0.0.1:8000/admin/
1023 14:32:52
1024 voilà l'admin
1025 14:33:10
1026 si tout va bien... vous voyez
1027 14:33:19
1028 Etablissements
1029 14:33:22
1030 Personnes
1031 14:33:24
1032 prêt à être géré dans l,admin
1033 14:33:32
1034 des questions?
1035 14:33:35
1036 (je suis en retard... et Tri attend :-/ )
1037 14:33:52
1038 la vraie conclusion :
1039 14:34:19
1040 on n,a presque rien fait
1041 14:34:24
1042  
1043 progfou 14:34:28
1044 ‎[10:34:24] ‎progfou‎: REMARQUE: ça marche pas avec l'application 'carto.annuaire', sans doute une histoire de chemin… j'ai dû mettre 'annuaire' pour que ça passe      
1045 
1046 davin.baragiotta 14:34:34
1047 et ce qu'on a fait... on le fait une fois dans un projet (au début)
1048 reste à voir comment améliorer la gestion dans admin :
1049 14:34:54
1050 lire la doc admin et modifier admin.py
1051 14:35:01
1052 c'est tout
1053 14:35:03
1054 le reste = atelier Django Frontend demain... suivi de Django inspectdb par olivier
1055 14:35:23
1056 (pour reprendre données d'une DB existante)
1057 14:35:32
1058 questions rapides?
1059 14:35:40
1060  
1061 progfou 14:36:45
1062 je pense que tu peux déborder un peu, genre 15 min, si tu as besoin
1063 avec l'accord du présentateur suivant ;)
1064 14:36:55
1065  
1066 davin.baragiotta 14:37:50
1067 magnifique      
1068 
1069 progfou 14:38:14
1070 ‎[10:38:11] ‎sekou.diall‎: Question : j'ai une erreur IndentationError at /adminunexpected indent (urls.py, line 5)     
1071 
1072 davin.baragiotta 14:38:38
1073 en Python
1074 l'indentention est importante... obligatoire
1075 14:38:47
1076 compte des espaces au besoin ;)
1077 14:38:54
1078 (mais configure ton éditeur pour que touche tab donne 4 espaces ; c'est le mieux... même gedit peut faire ça)
1079 14:39:17
1080 ou copie-colle le code du pad, il marche
1081 14:39:49
1082  
1083 sekou.diall 14:40:01
1084 -ok     
1085 
1086 davin.baragiotta 14:40:04
1087 (après modif proposée par jc )
1088 https://coderpad.io/771405
1089 14:40:19
1090 autres questions?
1091 14:40:29
1092 un question pertinente serait : comment lier les Personne aux Etablissements
1093 14:41:04
1094 réponse : modifier les modèles en conséquence, dans models.py
1095 14:41:14
1096 en ajoutant les champs requis qu'on trouve dans la doc
1097 14:41:25
1098 en l'occurence : ForeignKey
1099 14:41:32
1100 qui lit un modèle vers autre
1101 14:41:39
1102 (y'a aussi ManyToMany... de mémoire)
1103 14:41:50
1104  
1105 claudine.mosozi 14:44:25
1106 oui
1107 pardon
1108 14:44:33
1109  
1110 davin.baragiotta 14:51:00
1111 ---------------------------------- FIN Atelier Django Backend ----------------------------      
1112 

Projet/SemaineTech/2013/Ateliers/DjangoBackend/Archive (dernière édition le 2013-09-05 16:19:38 par ArnaudAmelina)