Django, le framework Web-Python

date:2012-04-30 10:33
tags:django, python
category:Django
author:Rémy Hubscher

Qu’est-ce que Django ?

Django est un framework développé en Python, initialement pour un journal local dans le Kansas : World Online.

Un peu d’histoire

En 2003, deux développeurs (Adrian Holovaty et Simon Willison) ont décidé d’abandonner le langage PHP pour se mettre au Python afin de développer leur site dédié aux faits actuels. Pour améliorer le temps de développement, ils ont décidé de mettre en place un framework, une structure simple permettant de réduire considérablement le temps de développement d’un site. En deux ans, ce moteur a beaucoup changé, et change encore aujourd’hui, avec des ajouts et corrections.

C’est en 2005 que World Online décide d’ouvrir les portes de son framework : Django. Depuis ce framework a rencontré un franc succès. Il est utilisé par de nombreux développeurs ayant besoin de développer des sites de grande qualité, très rapidement.

Pourquoi “Django” ?

Le nom « Django » a été donné en souvenir de Django Reinhardt, guitariste jazz ayant vécu de 1910 à 1953. Il est considéré comme le meilleur guitariste manouche de tous les temps. Cet homme a beaucoup changé notre vision du jazz, et nous ne pouvons que l’en remercier. :)

Pour plus d’informations sur Django et ses origines, je vous redirige sur la FAQ officielle du projet [en].

Pourquoi utiliser Django ?

Pourquoi utiliser un Framework ?

Lorsque l’on réalise un site Internet, on en revient toujours aux même étapes :

  1. réalisation et codage du design ;
  2. réalisation des modules :
    1. réalisation du modèle de données concernant le module,
    2. réalisation des formulaires d’ajout, modification et suppression des données :
      1. vérification des données des formulaires,
      2. affichage des erreurs,
      3. réalisation et affichage des formulaires,
    3. réalisation des pages d’affichage du contenu du site ;
  3. réalisation d’une administration pour gérer les modules ;
  4. réalisation d’un espace utilisateur avec des droits sur l’accès aux données ;
  5. mise en place de flux RSS/ATOM ;
  6. mise en place d’un plan du site ;
  7. ...

Tout cela est relativement répétitif, et si, la première fois, ça peut paraître très amusant, on en arrive rapidement à faire des copier/coller, assez mauvaise méthode car source de nombreuses erreurs. Finalement on regroupe des morceaux de code en fonctions réutilisables.

À ce moment, on se rapproche de plus en plus de la notion de framework ci-dessus. L’avantage d’utiliser un framework existant et surtout Open Source tel que Django, c’est que nous ne sommes pas les seuls à l’utiliser, et que les bugs sont donc corrigés plus rapidement, les améliorations sont exécutées par plusieurs personnes et de manière bien mieux réfléchie.

C’est d’ailleurs tout l’intérêt d’utiliser un framework. En faire moins, pour en faire plus dans le même temps.

Pourquoi Django ?

Il existe de nombreux framework web, dans différents langages de programmation. Pourquoi utiliser spécifiquement Django et pas un autre ?

Voici une question à laquelle chacun a sa réponse ; d’ailleurs, tout le monde n’utilise pas Django. Vous êtes complètement libre de votre choix. Nous sommes nombreux à avoir choisi Django pour plusieurs raisons.

  • La simplicité d’apprentissage.
  • La qualité des applications réalisées.
  • La rapidité de développement.
  • La sécurité du site Internet final.
  • La facilité de maintenance des applications sur la durée.

On bénéficie de la clarté de Python, qui permet à plusieurs développeurs de travailler sur le même projet. Le style est imposé, donc tout le monde suit les mêmes règles, ce qui facilite les travaux en équipe et la clarté du code.

En comparaison avec le PHP, on se rend compte qu’il existe de nombreuses manières de faire. On peut placer des morceaux de codes PHP au milieu de pages HTML (une solution assez mal organisée), ou encore utiliser un moteur de templates pour séparer le code du HTML. En Python/Django, tout est mis en place pour ne pouvoir faire que ce qui est bien, et ce dès le début de l’apprentissage.

Mais encore ?

Voyons concrètement ce que Django apporte et profitons-en pour définir quelques termes. Pour commencer, reprenons notre code CGI (listing 1.1) :

#!/usr/bin/python

import MySQLdb

print "Content-Type: text/html"
print
print "<html><head><title>Livres</title></head>"
print "<body>"
print "<h1>Livres</h1>"
print "<ul>"

connection = MySQLdb.connect(user='moi', passwd='laissezmoientrer', db='ma_base')
cursor = connection.cursor()
cursor.execute("SELECT nom FROM livres ORDER BY pub_date DESC LIMIT 10")
for row in cursor.fetchall():
    print "<li>%s</li>" % row[0]

print "</ul>"
print "</body></html>"

connection.close()

On définit, dans un premier temps, le type de fichier généré, puis on affiche du code HTML, on récupère ensuite des informations sur des livres contenus dans une base de données, on ré-affiche du HTML, et on ferme notre connexion à la base de données.

Pour une page simple comme celle-ci, cette approche aisée peut convenir, mais lorsque l’application grossit, il devient de plus en plus compliqué de la maintenir.

Voyons comment nous aurions écrit cette page en utilisant Django. Il faut noter que nous avons séparé notre fichier en trois fichiers Python (models.py, views.py et urls.py) et un gabarit HTML (derniers_livres.html).

models.py

# models.py (les tables de la base de données)

from django.db import models

class Livre(models.Model):
    nom = models.CharField(maxlength=50)
    date_publication = models.DateField()

views.py

# views.py (la logique métier)

from django.shortcuts import render_to_response
from models import Livre

def derniers_livres(request):
    liste_livres = Livre.objects.order_by('-date_publication')[:10]
    return render_to_response('derniers_livres.html', {'liste_livres': liste_livres})

urls.py

# urls.py (la configuration de l'URL)

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'derniers-livres/$', app.views.derniers_livres),
)

templates/derniers_livres.html

<!-- derniers_livres.html (le gabarit) -->

<ul>
    {% for livre in liste_livres %}
            <li>{{ livre.nom }}</li>
    {% endfor %}
</ul>

Ne vous préoccupez pas pour le moment de savoir comment cela fonctionne, je prendrai bien soin de vous l’expliquer.

Ce qu’il faut noter ici, c’est la répartition du code selon son objet :

  • Le fichier models.py décrit la table pour stocker les données sous la forme d’une classe Python. Cette classe est appelée modèle.
  • Le fichier views.py contient la logique de la page, sous la forme de la fonction Python derniers_livres. Cette fonction est appelée vue.
  • Le fichier urls.py définit quelle vue sera appelée pour un modèle d’URL donné. Dans notre cas, derniers-livres/ sera traité par la fonction derniers_livres.
  • Le fichier derniers_livres.html est un gabarit HTML définissant l’aspect de la page. On l’appellera un template.

On nommera cette organisation de projet le MTV (Modèle Template Vue), proche parent du MVC (Modèle Vue Controleur).