Déployer une application Django

Un article de alwaysdata.

Python, comme les autres langages de programmation proposés par alwaysdata, tourne en FastCGI. Pour utiliser Django sur nos serveurs, il suffit simplement de suivre la section on a shared-hosting provider with Apache de la documentation officielle de Django.

Concrètement, voici une marche à suivre (parmi d'autres possibles) :

Préambule

Avant toute chose, choisissez la version de Django que vous voulez utiliser.

Les commandes pour créer un nouveau projet Django (remplacez mysite et myapp par les noms désirés) :

django-admin.py startproject mysite

cd mysite/

./manage.py startapp myfirstapp

Voyez la documentation Django à propos de django-admin.

Première étape

Créez un répertoire public à la racine de votre projet. À l'intérieur, créez un fichier django.fcgi contenant :

#!/usr/bin/python
import os, sys

_PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, _PROJECT_DIR)
sys.path.insert(0, os.path.dirname(_PROJECT_DIR))

_PROJECT_NAME = _PROJECT_DIR.split('/')[-1]
os.environ['DJANGO_SETTINGS_MODULE'] = "%s.settings" % _PROJECT_NAME

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

Donnez les droits d'exécution à ce fichier (en SSH : chmod +x django.fcgi).

Attention : Le fichier doit être au format UNIX et non DOS. Vous pouvez utiliser dos2unix en SSH pour convertir du format DOS au format UNIX.

Deuxième étape

Toujours dans le répertoire public, créez un fichier .htaccess contenant :

AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ django.fcgi/$1 [QSA,L]

Troisième étape

Cette étape n'est nécessaire que si vous utilisez l'interface d'administration de Django.

Toujours dans public, créez un lien symbolique media qui pointe vers les fichiers media de l'admin Django :

ln -s /usr/local/alwaysdata/python/django/1.1/django/contrib/admin/media/ media

Remplacez éventuellement 1.1 par la version de Django que vous utilisez.

Quatrième étape

Préparation de la base de données (example avec mysql).

À partir de votre interface d'administration alwaysdata, créez votre base de données en allant sur Bases de données › MySQL › Ajouter une base de données.

Pour Django version 1.1 et antérieurs

Adaptez les lignes suivantes du fichier mysite/settings.py :

DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'myaccount_mybase'
DATABASE_USER = 'myaccount'
DATABASE_PASSWORD = 'mypassword'
DATABASE_HOST = 'mysql.alwaysdata.com'

Vous pouvez également utiliser PostgreSQL en tant que système de gestion de base de données :

DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME = 'myaccount_mybase'
DATABASE_USER = 'myaccount'
DATABASE_PASSWORD = 'mypassword'
DATABASE_HOST = 'postgresql.alwaysdata.com'
Pour Django version 1.2 et ultérieurs

Adaptez les lignes suivantes du fichier mysite/settings.py :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myaccount_mybase',
        'USER': 'myaccount',
        'PASSWORD': 'monmotdepasse',
        'HOST': 'mysql.alwaysdata.com',
    }
}

Vous pouvez également utiliser PostgreSQL en tant que système de gestion de base de données :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myaccount_mybase',
        'USER': 'myaccount',
        'PASSWORD': 'monmotdepasse',
        'HOST': 'postgresql.alwaysdata.com',
    }
}

Cinquième étape

Pour garantir la sécurité de vos fichiers et permettre à l'administration Django de fonctionner, cette étape est nécessaire.

À partir de votre interface d'administration alwaysdata, dans la partie Domaines, faites pointer votre sous-domaine vers le répertoire public de votre projet.

Ainsi, si votre projet est dans /home/myaccount/myproject et que vous voulez que http://myaccount.alwaysdata.net arrive directement sur votre application, vous devrez modifier le répertoire de destination du sous-domaine myaccount.alwaysdata.net vers /myproject/public (au lieu de /www/ par défaut).

C'est pourquoi vous devez également mettre vos fichiers statiques dans le répertoire public, par exemple :

/home/myaccount/myproject/public/site_media

avec, dans mysite/settings.py :

MEDIA_ROOT = '/home/myaccount/myproject/public/site_media/'
MEDIA_URL = '/site_media/'

et dans le fichier html (template) :

<img src="/site_media/images/myimage.gif" alt="my image"/>

Au final

L'arborescence de votre dossier devrait ressembler à quelque chose comme cela :

myproject/
    __init__.py
    manage.py
    public/
        django.fcgi
        .htaccess
        media/
        site_media/
    settings.py
    urls.py
    myapp/
        views.py
        models.py


À chaque modification de votre projet, vous devez redémarrer l'instance FastCGI pour que les nouvelles modifications soient prises en compte. Pour cela, il vous suffit d'aller sur l'interface d'administration, Avancé › Processus et de cliquer sur le bouton Terminer Image:IconDelete.png. Le redémarrage est automatique.

Diagnostiquer un problème de déploiement

La majorité des problèmes que vous aurez en suivant ces instructions se caractérisent par une erreur 500 “Internal Server Error” lorsque vous affichez votre site. La première chose à faire pour trouver la source du problème est de se connecter en SSH et d'afficher le contenu du fichier ~/admin/log/error.log, comme ceci :

 tail -n 50 ~/admin/log/error.log

Si vous avez de la chance, vous trouverez dans le texte affiché une erreur Python classique (backtrace indiquant où est l'erreur) que vous pourrez normalement facilement corriger. Si cependant à la place, vous trouvez quelque chose comme ceci, continuez à lire :

 [Mon Dec 06 05:19:07 2010] [error] [client 217.128.57.136] Premature end of script headers: django.fcgi

Toujours en SSH, lancez la commande suivante, en adaptant le chemin vers django.fcgi si besoin :

 /home/myaccount/myproject/public/django.fcgi
  • Si vous obtenez un message d'erreur tel que bash: permission denied: /home/myaccount/myproject/public/django.fcgi, lancez la commande chmod +x /home/myaccount/myproject/public/django.fcgi et réessayez ;
  • Si ce message ressemble plutôt à import: unable to open X server `' @ import.c/ImportImageCommand/367., éditez votre fichier django.fcgi et assurez vous que la première ligne du fichier est #!/usr/bin/python. Si non, rajoutez cette première ligne, et réessayez.

Dans le cas où ces instructions n'ont pas suffit à trouver votre problème, n'hésitez pas à poster sur notre forum ou à faire un ticket de support.

ImportError: Could not import settings

Si, lors de l'exécution de manage.py, vous rencontrez l'erreur:

 ImportError: Could not import settings 'myProject.settings' (Is it on sys.path?): No module named myProject.settings

Vous devez modifier votre fichier manage.py afin d'importer votre fichier settings.py et puis appeler la fonction execute_manager():

 from django.core.management import execute_manager
 import settings # Assumed to be in the same directory as manage.py.
 if __name__ == "__main__":
   execute_manager(settings)

Après une installation vierge, votre fichier manage.py ressemblera à ceci:

 #!/usr/bin/env python
 import os
 import sys
 from django.core.management import execute_manager
 import settings # Assumed to be in the same directory as manage.py.
 
 if __name__ == "__main__":
   execute_manager(settings)
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
   from django.core.management import execute_from_command_line
   execute_from_command_line(sys.argv)


Voir aussi