lindev.fr

Aller au contenu | Aller au menu | Aller à la recherche

20 oct. 2011

Django étape par étape [Apache2 et mod_wsgi]

logo_django.png
Comme précisé dans le précédent billet, j'aime utiliser un environnement aussi proche que possible à l'environnement de production, cela commence par le serveur web finalement utilisé, dans mon cas Apache.
Voyons comment configurer un Vhost pour gérer notre projet Django

Le programme

  1. -OnLine- Présentation et installation du framework et MysqlDB
  2. --> Configuration du serveur web Apache, liaison avec le projet
  3. -OffLine- Première application sous django ( urls.py, settings.py )
  4. -OffLine- Mise en place de Django-Debug-toolbar
  5. -OffLine- Protection CSRF , utilisation , Jquery et requetes AJAX
  6. -OffLine- Les formulaires, utilisation basique du paquet Django.forms
  7. -OffLine- Les models création, utilisation et synchronisation
  8. ... la suite en fonction de mon apprentissage personnel :)

Prérequis


Nous allons nous mettre en condition pour mener à bien cette étape qui finalement, vous allez le voir, sera assez rapide.
Je part du principe ou apache est installé avec les paquets par défaut de la distribution.
Pour prendre en charge un projet python, nous avons plusieurs pistes,

  • mod_python

Déprécié, je ne l'utiliserai donc pas

  • fastcgi ou sgi
  • mod_wsgi

C'est ce dernier mode que je vais détailler ici, bien que les autres soient viables et "comme le dit la documentation" plus performants dans certaines configurations, le mod_wsgi reste le mode conseillé par Django.

Rappel sur wsgi

wsgi est une interface entre le serveur HTTP et l'application Python.
Pour plus d'information sur le sujet je vous conseil le site officiel.

Mise en place

Au niveau de l'application

Pour permettre à notre application de tirer parti de wsgi, nous allons créer à la racine un répertoire nommé "apache", dans ce répertoire , nous allons créer un fichier nommé django.wsgi.
Voici le contenu du fichier "django.wsgi"

import os, sys

sys.path.append('/var/www')

os.environ['DJANGO_SETTINGS_MODULE'] = 'monprojet.settings'

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
    #environ['SCRIPT_NAME'] = '/'
    environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO']
    return _application(environ, start_response)

info.png Deux lignes sont à modifier selon votre projet, et son emplacement ( lignes 2 et 3 ).
Dans le précédent billet, nous avons créer le projet monprojet à l'emplacement /var/www

Niveau apache

Il nous suffit de configurer correctement notre Vhost en précisant quelques paramètres propres à wsgi.
Voici le vhost de notre projet nommé : monprojet et disponible à l'adresse http://monprojet.com

<VirtualHost *:80>
        ServerAdmin monemail@domaine.com
        ServerName  monpropjet.com
        ServerAlias www.monprojet.com

        DocumentRoot /var/www/monprojet/

        Alias /static/ /var/www/monprojet/static/
        Alias /uploads/ /secure_dir/uploads/

        WSGIDaemonProcess daemon-monprojet user=www-data group=www-data processes=1 maximum-requests=1 threads=1 inactivity-timeout=6
        WSGIProcessGroup daemon-monprojet
        WSGIScriptAlias / /var/www/monprojet/apache/django.wsgi

        <Directory /var/www/monprojet/apache>
                Order deny,allow
                Allow from all
        </Directory>

        <Location "/uploads/">
                SetHandler None
        </Location>

        ErrorLog /var/log/apache2/monprojet.error.log
        CustomLog /var/log/apache2/mystock.access.log combined

</VirtualHost>

Les fichiers "statiques" ( img,css,js,... ) seront servi directement par apache, à partir du moment ou les urls pointent vers /static/* , concernant /uploads/, comme son nom l'indique, pointe vers l'espace de stockage des éventuelles uploads des clients, il est conseillé de mettre hors d'atteinte les fichiers uploadés par les clients, et encore moins interprétables, d'ou le SetHandler None.

Pour le reste, apache passe le relais à WSGI, vous devrai certainement affiner les paramètres, tels que processes, maximum-requests threads ou inactivity-timeout, il y en a d'autres, et je vous laisse lire la doc pour ajouter/modifier des paramétrés à WSGIDaemonProcess

warning.pngAttention à mettre un nom de daemon différent à chaque vhost hébergeant un projet Django.
Veillez à adapter le Vhost à votre environnement ( directory, user et group )

Ne vous reste plus qu'à ré-démarrer votre serveur Apache ( apres avoir enregistré votre vhost, en site-enabled ou simplement Inclus dans httpd.conf ).

Conclusion

Voilà , notre environnement de développement est maintenant en place, nous allons pouvoir dans le prochain billet attaquer un peu le code, nous verrons l’organisation des "applications", la configuration de base et les templates partagés ect ..

11 oct. 2011

Django étape par étape [Installation Environnement]

logo_django.png
Voilà maintenant quelques temps que je voulais allier python et développement web, c'est aujourd'hui chose faite :) .

Après quelques recherches sur la toile, mon choix s'est finalement trouvé vers "django".
La documentation complète et claire, une communauté active ainsi que de nombreux exemples sont disponibles, du petit bout de code à l'application intégrable à votre projet.
Il faut bien évidemment prendre quelques nouvelles habitudes pour se sentir un minimum alaise, mais comme souvent avec des produits de cette qualités, la courbe de progression est rapide.

C'est par ces quelques billets que je vais tenter de vous aider à passer avec succès la mise en place et le développement basique d'un projet basé sur Django.
Les "pro" ou plutôt "djangoer's barbu" ne vont peut être pas trouver dans mes explications les "bests practices" qu'ils pratiquent quotidiennement, mais ces billets sont destinés à partager ma découverte et aider les débutants qui comme moi apprennent à utiliser ce superbe outil.
A tout lecteur, n'hésitez pas à laisser vos conseils, qui seront profitables à tous.

Le programme

  1. --> Présentation et installation du framework et MysqlDB
  2. -OnLine- Configuration du serveur web Apache, liaison avec le projet
  3. -OffLine- Première application sous django ( urls.py, settings.py )
  4. -OffLine- Mise en place de Django-Debug-toolbar
  5. -OffLine- Protection CSRF , utilisation , Jquery et requetes AJAX
  6. -OffLine- Les formulaires, utilisation basique du paquet Django.forms
  7. -OffLine- Les models création, utilisation et synchronisation
  8. ... la suite en fonction de mon apprentissage personnel :)

Système d’exploitation et python

Je travail sous mac et linux(Débian), et peu donc vous confirmer que les explications qui vont suivre sont tout à fait fonctionnelles sur ces deux systèmes ( je suppose que nos utilisateurs M$, n'auront aucun mal à s'adapter ).

python_logo_no_text.jpgConcernant Python, j'utilise pour mes développements la version 2.7 / 2.6 sous mac.
Je conseil tout de même à tout débutant de suivre les quatre pages de tutoriel officielles qui donnent déjà un bel aperçu de l'efficacité de l'outil.

Installation de Django

La version utilisée sera la toute dernière stable au moment ou j’écris ces lignes, à savoir la version de django 1.3

L'installation de Django est très simple, voyez par vous-même, en trois lignes, le Framework est prêt à vous rendre service.

Installation proprement dite

wget http://media.djangoproject.com/releases/1.3/Django-1.3.1.tar.gz
tar xzvf Django-1.3.1.tar.gz
cd  Django-1.3.1
sudo python setup.py install

Pour vérifier la disponibilité de django sur votre système, il vous suffit de lancer une console python, et d'importer le paquet django

Lancement de la console python:

(1:5)$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Testons l’importation de django:

>>> import django
>>> print django.get_version()
1.3

Installation de mysqldb

Mon premier projet django utilisera une base de données Mysql, il me faut donc installer l'API adéquate, MysqlDB.
Deux solutions, utiliser la version disponible dans les dépôts officiels de la distribution utilisée ( Débian Squeeze dans mon cas ), ou l'installer à partir des sources, dans les deux cas, il vous faut avoir les librairies de mysql-client, d'installées .
J'ai opté pour l'utilisation de la version dépôt pour débian, et la compilation des sources pour Mac.

Installation de mysqldb sous linux

 
apt-get install python-setuptools python-mysqldb

Nous voilà enfin prêt pour créer notre premier projet django. Dans mon exemple , je vais placer mon projet en suivant le chemin suivant /var/www

Initialisation du projet

Nous y voilà, les premières briques sont prêtes à être posées, Django nous offre un utilitaire permettant d'initialiser le projet de façon automatique... Puisque c'est automatique, profitons en, l'informaticien est par défaut fainéant ;) ( ce serai surtout stupide de faire à la main ce qui peut être fait automatiquement ).

django-admin.py

Je ne vais pas détailler toutes les fonctionnalités de cet utilitaire, par contre, je vous invite à parcourir la documentation officielle pour entrer dans les détails.

Initialiser le projet

cd /var/www 
django-admin.py startproject <mon projet> 

Regardons ce que cette commande magique à faite.

(1:8)$ tree monprojet/
monprojet/
├── __init__.py
├── manage.py
├── settings.py
└── urls.py

0 directories, 4 files

manage.py Le script manage.py, est un intermédiaire entre votre projet et django-admin.py, qui a pour but de nous simplifier la vie, en déclarant par exemple automatiquement le projet dans l’environnement python.
Nous utiliserons donc de façon plus régulière de dernier pour les tâches d'administration du projet.

settings.py Détaillé dans le tutoriel N° 3
La configuration global de votre projet, c'est dans ce fichier que nous allons définir le type de base de données utilisé, les applications installées au sein du projet, la définition de middleware, définition de context, template_context_processor nous verrons de quoi il s'agit plus tard, définition de variables de configuration, url des fichiers statiques, des templates ect ect ... Bref LE fichier de configuration de votre projet

url.py Détaillé dans le tutoriel N° 3
C'est à partir de là qu'une requête sera redirigée vers une "action". Nous verrons plus tard comment django gère les requêtes et les rediriges, comment l'on peut passer les paramètres "GET", passer des paramètres pas defaut, et bien plus encore, Django possède un système de "dispatche" très puissant et performant.

Fin de la première partie

Nous avons vu dans ce billet comment installer Django, MysqlDb, et comment initialiser un projet "vide", vous aller me dire il manque des choses .. oui effectivement, mais avant d'aller plus loin, il nous faut mettre en place un serveur HTTP pour tester notre code pendant son développement.
Django fourni un serveur HTTP pour le développement , à n'utiliser sous aucun prétexte pour la production .
Je suis habitué à développer dans un environnement le plus proche possible de l'environnement de production, c'est pourquoi j'ai décidé d'utiliser le serveur web Apache avec le mod_wsgi pour la suite de cette série de tutos sur Django.
Je ne vous parlerai donc pas du serveur Http embarqué, mais si vous voulez le tester, il vous suffit depuis la racine de votre projet d'entrer la commande suivante

python manage.py runserver

A chaque modification d'un fichier, celui-ci se relance pour prendre en compte les changements.

Dans le prochain Billet

Dans le prochain billet je vais donc détailler la configuration d'un vhost Apache, pour gérer notre projet Django, avec le mod-wsgi

- page 1 de 47