Modifications entre les versions 1 et 17 (s'étendant sur 16 versions)
Version 1 à la date du 2012-02-24 20:54:11
Taille: 5506
Éditeur: DavinBaragiotta
Commentaire: ébauche avec contenu frontend
Version 17 à la date du 2012-02-26 10:19:03
Taille: 9393
Éditeur: DavinBaragiotta
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
= Django : Architecture d'un projet, Backend (admin) et Frontend (interfaces publiques d'un site) = = Django : Architecture d'un projet, Backend et Frontend =
Ligne 9: Ligne 9:
 * Objectifs
  * connaître l'architecture d'un projet : principaux fichiers
  * gérer data dans backend
  * présenter data dans frontend
 * Documentation
  * doc : bonne version de django
   * officielle : https://docs.djangoproject.com/en/1.3/
   * français : http://docs.django-fr.org/
  * tutoriel
   * Part 1 : créer un projet, créer une app, jouer avec ORM (API) ''couvert ici''
   * Part 2 : backend (admin) ''couvert ici''
   * Part 3 : frontend ''couvert ici, plus straightforward même ;)''
   * Part 4 : forms et vues génériques ''pas couvert ici''
 * Environnement technique
  * Python >= 2.5
  * Django 1.3.1
Ligne 11: Ligne 28:
== PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET ==

=== Développement web ===

 * schéma : le développement web
  * rôle d'un framework web : aider à construire réponse à une requête
 * développement (DEV)
 * déploiement (PROD, TEST)

=== Django ===

Pourquoi django vs autre framework
 * all-in-one
 * admin : meilleur vendeur ;)
 * docs
 * communauté : utilisation répandue

Principaux fichiers
 * models.py
 * admin.py
 * urls.py
 * views.py
 * templates (HTML)

=== Projet : définition du besoin ===

La Direction de l'AUF souhaite pouvoir créer un répertoire des établissements du BMO.

(Ce n'est pas encore vrai pour le BMO mais des projets ananologues sont en cours dans d'autres régions : BECO, BAO, BAP...).

On veut gérer :
 * quels professeurs sont dans quels établissements
 * quelles formations donnent nos établissements membres
 * quels laboratoires de recherche sont dans nos établissements membres

=== Projet : modélisation ===

 * Personne
 * Etablissement
 * Formation
 * Laboratoire

----
Ligne 13: Ligne 74:
=== Repartir des sources initiales ===

Repartir du projet créé lors de l'atelier du 2011-12-07 : sources initiales [[attachment:sources.tar.gz]]

Nous avions alors :
 * Créé le projet carto
 * Créé l'application etablissements
 * Créé les modèles Etablissement et Formation
 * Géré dans l'admin des Etablissements et des Formations
=== Création du projet ===

Le projet se nomme "Répertoire du BMO".
{{{
django-admin.py startproject bmo_repertoire
cd bmo_repertoire
}}}

 * survol des fichiers générés

{{{
python manage.py runserver
}}}

 * settings.py
  * {{{DATABASES}}}

=== Création d'une application ===

{{{
python manage.py startapp personnes
}}}

 * survol fichiers

 * personnes/models.py
 * documentation :
  * https://docs.djangoproject.com/en/1.3/topics/db/models/
  * https://docs.djangoproject.com/en/1.3/ref/models/fields/
 * yeah! on code!
  * Personne.nom
  * Etablissement.nom
 {{{
class Etablissement(models.Model):
    nom = models.CharField(max_length=255)

class Personne(models.Model):
    nom = models.CharField(max_length=255)
}}}

 * settings.py
  * {{{INSTALLED_APP}}}
   * 'personnes'

 * création des tables dans DB correspondant à nos modèles
 {{{
python manage.py syncdb
}}}

=== Backend : gérer les données dans l'admin ===

 * urls.py
 ''activer admin : décommenter''
  * import
  * autodiscover
  * url : admin/

 * http://127.0.0.1:8000/

 * settings.py
  * {{{INSTALLED_APP}}}
   * 'django.contrib.admin'

 * personnes/admin.py
 ''enregistrer modèles voir tutoriel Part 2''
  * https://docs.djangoproject.com/en/1.3/intro/tutorial02/
 {{{
from django.contrib import admin
from personnes.models import *

admin.site.register(Etablissement)
admin.site.register(Personne)
}}}

 * http://127.0.0.1:8000/admin/

 * personnes/models.py
 ''ajouter des attributs (des champs) et des méthodes à nos modèles existants''
  * Personne.prenom
  * Etablissement.sigle
  * {{{def __unicode__(self):}}}

 * delete bmo_repertoire.db
 {{{
rm bmo_repertoire.db
}}}
 * (re)création de la base de DB pour avoir tables avec même structure que nos modèles modifiés
 {{{
python manage.py syncdb
}}}

 * personnes/models.py
 ''ajouter une relation entre nos modèles''
  * Personne.universite

==== Fixtures ====

Prépopuler le projet avec des données...

 * https://docs.djangoproject.com/en/1.3/ref/django-admin/
 
==== South ====

Gestion complète des migrations de données (structure et données de la DB).

 * http://south.aeracode.org/
Ligne 26: Ligne 184:
 https://docs.djangoproject.com/en/1.1/topics/http/urls/  https://docs.djangoproject.com/en/1.3/topics/http/urls/
Ligne 30: Ligne 188:
 https://docs.djangoproject.com/en/1.1/topics/http/views/  https://docs.djangoproject.com/en/1.3/topics/http/views/
Ligne 34: Ligne 192:
 https://docs.djangoproject.com/en/1.1/intro/tutorial03/  https://docs.djangoproject.com/en/1.3/intro/tutorial03/ {{{
from django.shortcuts import render_to_response
from django.template import Context, RequestContext

def home(request):
    c = {}
    return render_to_response("home.html", Context(c), context_instance = RequestContext(request))
}}}
Ligne 37: Ligne 202:
 https://docs.djangoproject.com/en/1.1/topics/templates/  https://docs.djangoproject.com/en/1.3/topics/templates/
Ligne 71: Ligne 236:
from etablissements.models import * from personnes.models import *
Ligne 75: Ligne 240:
e.formation_set.all()
f = Formation.objects.get(id=1)
e.personne_set.all()
f = Personne.objects.get(id=1)
Ligne 78: Ligne 243:
f = Formation.objects.get(id=314) f = Personne.objects.get(id=314)
Ligne 80: Ligne 245:
formations = Formation.objects.filter(etablissement__nom__contains='Hanoi')
}}}

 * etablissements/models.py
 {{{
related_name = "formations"
personnes = Personne.objects.filter(etablissement__nom__contains='Alexandrie')
}}}

 * personnes/models.py
 {{{
related_name = "personnes"
Ligne 90: Ligne 255:
e.formations.all()
e.formations.count()
e.personnes.all()
e.personnes.count()
Ligne 104: Ligne 269:
== PARTIE 3 : PROJET CARTO PIMPÉ ==

Télécharger les sources finales du projet pimpé : sources finales [[attachment:sources.tar.gz]]

Pimpé? Quoi de neuf?
== PARTIE 3 : PROJET RÉPERTOIRE BOOSTÉ ==

Télécharger les sources finales du projet boosté : sources finales [[attachment:sources.tar.gz]]

 * superuser dans la DB de ces sources :
  * userna
me : giotta
  * password : admin
 * pour créer un autre superuser (le vôtre) : {{{
python manage.py createsuperuser
}}}

Boost
é? Quoi de neuf?
Ligne 125: Ligne 297:
https://docs.djangoproject.com/en/1.1/howto/static-files/ https://docs.djangoproject.com/en/1.3/howto/static-files/
Ligne 135: Ligne 307:
MEDIA_URL = '/static/' MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'sitestatic')
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), "static"),
)
Ligne 140: Ligne 319:
from django.conf import settings
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': settings.MEDIA_ROOT}),
    )
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns += staticfiles_urlpatterns()
Ligne 166: Ligne 342:
  * urls.py : import des urls de l'app etablissements
  * etablissements/urls.py
  * etablissements/views.py
  * templates/etablissements/*

=== Admin pimpé : ModelAdmin ===

 * etablissements/admin.py

 * classes EtablissementAdmin, FormationAdmin
  * urls.py : import des urls de l'app personnes
  * personnes/urls.py
  * personnes/views.py
  * templates/personnes/*

=== À faire : booster Admin : ModelAdmin ===

 * personnes/admin.py

 * classes EtablissementAdmin, PersonneAdmin
Ligne 181: Ligne 357:
admin.site.register(Formation, FormationAdmin) admin.site.register(Personne, PersonneAdmin)
Ligne 189: Ligne 365:
  * plus? https://docs.djangoproject.com/en/1.1/ref/contrib/admin/   * plus? https://docs.djangoproject.com/en/1.3/ref/contrib/admin/
Ligne 195: Ligne 371:
https://docs.djangoproject.com/en/1.1/ref/django-admin/ https://docs.djangoproject.com/en/1.3/ref/django-admin/
Ligne 211: Ligne 387:
== PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION PROJET POUR LE PROJET CARTO ==

=== Ajouter modèle Projet ===

 * Projet
== PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION FORMATION POUR LE PROJET RÉPERTOIRE ==

=== Ajouter modèle Formation ===

 * Formation
Ligne 219: Ligne 395:
  * etablissements

=== Autre exercice : durée d'un Projet et avancement d'un Projet ===

 * Projet.duree()
  * etablissement

=== Autre exercice : durée d'une Formation ===

 * Formation.duree()
Ligne 226: Ligne 402:
}}}
 * Projet.avancement()
 {{{
"""Durée réelle à partir de la date de début jusqu'à maintenant."""
Ligne 256: Ligne 428:



== CONCLUSION ==

 * documentation + interactivité + introspection
 * scripts + modules
 * enjoy!

Django : Architecture d'un projet, Backend et Frontend


INTRODUCTION

  • Objectifs
    • connaître l'architecture d'un projet : principaux fichiers
    • gérer data dans backend
    • présenter data dans frontend
  • Documentation
    • doc : bonne version de django
    • tutoriel
      • Part 1 : créer un projet, créer une app, jouer avec ORM (API) couvert ici

      • Part 2 : backend (admin) couvert ici

      • Part 3 : frontend couvert ici, plus straightforward même ;)

      • Part 4 : forms et vues génériques pas couvert ici

  • Environnement technique
    • Python >= 2.5

    • Django 1.3.1


PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET

Développement web

  • schéma : le développement web
    • rôle d'un framework web : aider à construire réponse à une requête
  • développement (DEV)
  • déploiement (PROD, TEST)

Django

Pourquoi django vs autre framework

  • all-in-one
  • admin : meilleur vendeur ;)

  • docs
  • communauté : utilisation répandue

Principaux fichiers

  • models.py
  • admin.py
  • urls.py
  • views.py
  • templates (HTML)

Projet : définition du besoin

La Direction de l'AUF souhaite pouvoir créer un répertoire des établissements du BMO.

(Ce n'est pas encore vrai pour le BMO mais des projets ananologues sont en cours dans d'autres régions : BECO, BAO, BAP...).

On veut gérer :

  • quels professeurs sont dans quels établissements
  • quelles formations donnent nos établissements membres
  • quels laboratoires de recherche sont dans nos établissements membres

Projet : modélisation

  • Personne
  • Etablissement
  • Formation
  • Laboratoire


PARTIE 2 : HANDS-ON : PROJET ET APPLICATIONS

Création du projet

Le projet se nomme "Répertoire du BMO".

django-admin.py startproject bmo_repertoire
cd bmo_repertoire
  • survol des fichiers générés

python manage.py runserver
  • settings.py
    • DATABASES

Création d'une application

python manage.py startapp personnes

Backend : gérer les données dans l'admin

  • urls.py

    activer admin : décommenter

    • import
    • autodiscover
    • url : admin/
  • http://127.0.0.1:8000/

  • settings.py
    • INSTALLED_APP

      • 'django.contrib.admin'
  • personnes/admin.py

    enregistrer modèles voir tutoriel Part 2

    from django.contrib import admin
    from personnes.models import *
    
    admin.site.register(Etablissement)
    admin.site.register(Personne)
  • http://127.0.0.1:8000/admin/

  • personnes/models.py

    ajouter des attributs (des champs) et des méthodes à nos modèles existants

    • Personne.prenom
    • Etablissement.sigle
    • def __unicode__(self):

  • delete bmo_repertoire.db
    rm bmo_repertoire.db
  • (re)création de la base de DB pour avoir tables avec même structure que nos modèles modifiés
    python manage.py syncdb
  • personnes/models.py

    ajouter une relation entre nos modèles

    • Personne.universite

Fixtures

Prépopuler le projet avec des données...

South

Gestion complète des migrations de données (structure et données de la DB).

Frontend : présenter les données

  • urls.py

    https://docs.djangoproject.com/en/1.3/topics/http/urls/

    • home
  • views.py

    https://docs.djangoproject.com/en/1.3/topics/http/views/

    voir tutoriel Part 3 (version shortcut)

    https://docs.djangoproject.com/en/1.3/intro/tutorial03/

    from django.shortcuts import render_to_response
    from django.template import Context, RequestContext
    
    def home(request):
        c = {}
        return render_to_response("home.html", Context(c), context_instance = RequestContext(request))
  • templates

    https://docs.djangoproject.com/en/1.3/topics/templates/

    • créer répertoire templates
    • settings.py
      import os
      TEMPLATE_DIRS = (
          # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
          # Always use forward slashes, even on Windows.
          # Don't forget to use absolute paths, not relative paths.
          os.path.join(os.path.dirname(__file__), "templates"),
      )
    • templates/home.html
  • views.py

    passer une variable au template

  • templates/home.html

    utiliser une variable :

    {{ var }}
  • views.py

    endroit où on code la logique en Python...

    ...plus simple si explore interactivement

    python manage.py shell
  • ORM (API) : object relationnal mapping
    from personnes.models import *
    etablissements = Etablissement.objects.all()
    for e in etablissements: print e
    e = etablissements[0]
    e.personne_set.all()
    f = Personne.objects.get(id=1)
    f.id
    f = Personne.objects.get(id=314)
    e.id
    personnes = Personne.objects.filter(etablissement__nom__contains='Alexandrie')
  • personnes/models.py
    related_name = "personnes"
  • relancer shell
    e.personnes.all()
    e.personnes.count()
  • views.py

    passer les variables pertinentes pour accueil

  • templates/home.html

    boucle for dans template :

    {% for e in etablissements %}
    {% endfor %}

PARTIE 3 : PROJET RÉPERTOIRE BOOSTÉ

Télécharger les sources finales du projet boosté : sources finales sources.tar.gz

  • superuser dans la DB de ces sources :
    • username : giotta
    • password : admin
  • pour créer un autre superuser (le vôtre) :

    python manage.py createsuperuser

Boosté? Quoi de neuf?

Héritage de templates

  • base.html
    {% block main %}
  • templates
    {% extends "base.html" %}
    {% block main %}

Fichiers statiques : CSS, images et js

https://docs.djangoproject.com/en/1.3/howto/static-files/

  • répertoire : static
    • css
    • images
    • js
  • settings.py
    MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media')
    MEDIA_URL = '/media/'
    
    STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'sitestatic')
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = (
        os.path.join(os.path.dirname(__file__), "static"),
    )
  • urls.py
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
    
    urlpatterns += staticfiles_urlpatterns()

Connexion du user

  • templates
    • connexion.html
    • deconnexion.html
  • urls.py
    • connexion
    • deconnexion
  • settings.py
    LOGIN_REDIRECT_URL = "/"

URL avec paramètres

  • pages de détail : capter l'id de l'objet
    • urls.py : import des urls de l'app personnes
    • personnes/urls.py
    • personnes/views.py
    • templates/personnes/*

À faire : booster Admin : ModelAdmin

Charger données initiales : fixtures

https://docs.djangoproject.com/en/1.3/ref/django-admin/

  • créer répertoire fixtures à la racine
    python manage.py dumpdata > initial_data.json
  • mettre initial_data.json dans fixtures
  • pour récupération data :
    python manage.py syncdb
    no (pas créer user)
    python manage.py loaddata fixtures/initial_data.json

PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION FORMATION POUR LE PROJET RÉPERTOIRE

Ajouter modèle Formation

  • Formation
    • nom
    • date_debut
    • date_fin
    • etablissement

Autre exercice : durée d'une Formation

  • Formation.duree()
    """Durée prévue en fonction des dates de début et de fin"""

CONCLUSION : POUR CONTINUER

Ateliers/2012-02-25/Plan (dernière édition le 2012-02-26 10:19:03 par DavinBaragiotta)