Django-CMS

De SeRoM - Wiki
Révision de 9 février 2014 à 14:46 par Admin (discussion | contributions) (Menu)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Déploiement d'un environnement de travail

On crée un environnement avec virtualenv:

 virtualenv django-cms-test --no-site-packages

Note

Note

Pour savoir comment installer proprement virtualenv et pip allez lire l'article suivant: Installation propre de python avec virtualenv.

Installation de Django-CMS

Activons notre environnement de travail fraichement créé:

 . ./django-cms-test/bin/activate
 cd ./django-cms-test/

On peut demander à pip de nous installer notre django-cms:

 pip install django-cms

Il va installer les différentes dépendances (django, south, sekizai, html5lib, ...). Il y a deux exceptions à cela:

  • PIL (Python Images Library) indispensable pour jouer avec les images que l'on voudra afficher dans notre CMS.
 pip install pil

Tip

Tips

un moyen plus simple mais moins propre est d'installer PIL depuis les packages système (aptitude install), puis de pointer dessus:

ln -s /usr/local/lib/python2.7/dist-packages/PIL ./lib/python2.7/site-packages/PIL
  • pitz (Python TimeZone) aide à gérer les dates avec la notion de TimeZone.
 pip install pytz
  • Et l'interface python pour la base de donnée. Elle dépend du back-end DB. Ici j'ai choisi d'utilisé ma Base MySQL.
 pip install mysql-python

Tip

Tips

Attention pour installer le package mysql-python, pip va avoir besoin d'un mysql_config. Il fait parti du package système libmysqlclient-dev. Pensez à l'avoir installé avant.

aptitude install libmysqlclient-dev

Prérequis: Django

Django project

Il faut commencer par déployer / configurer l’environnement django.

 django-admin.py startproject monsite

Configuration Apache

Si ce n'est pas déjà réalisé pour un autre projet, il va falloir configurer Apache pour service du python dans un environnement virtualisé virtualenv.

Attention

Attention

Depuis la version 1.5 de Django le mod_python d'apache est déprécié. Il faut utiliser en lieu et place le mod_wsgi.

Si malgré tous vous essayez d'utiliser un Django < v1.5 avec un apache configuré avec mod_python voici l'erreur à laquelle vous aller typiquement vous confronter:

ImportError: No module named django.core.handlers.modpython

Alors on commence par installer la librairie Apache qui va bien:

 aptitude install libapache2-mod-wsgi

En même temps on va désactiver le module mod_python et ainsi être sûr qu'il ne se marche pas sur les pieds du mod_wsgi.

  a2dismod python

Pour qu'à l'avenir, on puisse héberger plusieurs projets Python avec des dépendances packages différentes (et c'est bien là le but de virtualenv), il nous faut une base la plus propre possible. Pour cela, on va créer un environnement vierge et dédié que l'on va appeler BASELINE.

 root@server:~# mkdir /usr/local/pythonenv
 root@server:~# cd /usr/local/pythonenv
 root@server:/usr/local/pythonenv# virtualenv --no-site-packages BASELINE
 ...
 done.

Note

Note

Il y a malgré tout une restriction. On ne peut pas mixer des environnements avec des versions de Python différent. Apache va utiliser la version de Pyhton

A partir de là, on peut pointer vers notre BASELINE dans notre configuration apache. On ajoute la ligne suivante à etc/apache2/mods-enabled/wsgi.conf:

 WSGIPythonHome /usr/local/pythonenv/BASELINE

On va également créer un fichier avec la définition de virtual host pour apache.

 vim /etc/apache2/sites-available/monsite
     <VirtualHost *>
             ServerName monsite.com
             ServerAlias www.monsite.com
             DocumentRoot /path/to/django-cms-test/monsite
             ErrorLog /var/log/apache2/monsite-error.log
             CustomLog /var/log/apache2/monsite-access.log combined
             Redirect /monsite http://www.monsite.com
     
             <Directory /path/to/django-cms-test/monsite>
                     <Files wsgi.py>
                     Order deny,allow
                     Allow from all
                     </Files>
             </Directory>
             WSGIScriptAlias / /path/to/django-cms-test/monsite/index.wsgi
             
             <Location "/media">
                     SetHandler None
                     Options -Indexes
             </Location>      
       
             <Location "/static">
                     SetHandler None
                     Options -Indexes
             </Location>
     
             <LocationMatch "\.(jpg|gif|png)$">
                     SetHandler None
             </LocationMatch>
     </VirtualHost>

On active ce virtual host que l'on vient de créer et on recharger apache:

 ln -s /etc/apache2/sites-available/django-cms-test /etc/apache2/sites-enabled/001-django-cms-test
 /etc/init.d/apache2 reload

Et pour finir on écrit notre fichier d'application wsgi /path/to/django-cms-test/monsite/index.wsgi. Ce fichier est en fait un programme python de lancement. On va l'utiliser, premièrement pour redéfinir le Python Path en y ajoutant notre dossier contenant notre site Django. Sans ça impossible de continuer. Ensuite on charge les settings de notre projet Django, et pour finir on lance l'application.

 import os
 import sys
 import site
 
 #============ Handle the Python Path ===========#
 
 ALLPYPATH = ["/path/to/django-cms-test/monsite/", "/path/to/django-cms-test/lib/python2.7/site-packages"]
 
 # Remember original sys.path.
 prev_sys_path = list(sys.path)
 
 # Add each new site-packages directory.
 for directory in ALLPYPATH:
   site.addsitedir(directory)
 
 # Reorder sys.path so new directories at the front.
 new_sys_path = []
 for item in list(sys.path):
     if item not in prev_sys_path:
         new_sys_path.append(item)
         sys.path.remove(item)
 sys.path[:0] = new_sys_path
 
 #============ Load the Django setting ===========#
 # (now that the pyhton path is Ok)
 
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "monsite.settings")
 
 from django.core.wsgi import get_wsgi_application
 application = get_wsgi_application()
 

Il faut bien évidement remplacer le chemin vers monsite par votre cas, ainsi que le pythonX.Y du site-packages.

Références

Quelques sites en référence:

Autres prérequis

Note

Note

il va de soit que les prérequis apache, mysql sont installés. Dans le cas contraire:

aptitude install apache2 mysql-server mysql-client libapache2-mod-wsgi

Configuration de Django-CMS

Settings

On ajoute les configuration de la base de données (on synchronisera le tout à la fin).

 vim monsite/settings.py

On compète un peu le fichier setting.py pour se simplifier la tâche:

 # -*- coding: utf-8 -*-
 import os
 gettext = lambda s: s
 PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))

On rajoute les INSTALLED_APPS suivantes dans les settings (setting.py):

   'cms', django CMS itself
   'mptt', utilities for implementing a modified pre-order traversal tree
   'menus', helper for model independent hierarchical website navigation
   'south', intelligent schema and data migrations
   'sekizai', for javascript and css management

Ainsi que les plugins (toujours dans les INSTALLED_APPS):

   'cms.plugins.file',
   'cms.plugins.flash',
   'cms.plugins.googlemap',
   'cms.plugins.link',
   'cms.plugins.picture',
 # 'cms.plugins.snippet',
   'cms.plugins.teaser',
   'cms.plugins.text',
   'cms.plugins.video',
   'cms.plugins.twitter',
   

Tip

Tips

Django-reversion

Et MiddleWares dans MIDDLEWARE_CLASSES:

   'django.middleware.locale.LocaleMiddleware',
   'django.middleware.doc.XViewMiddleware',
   'cms.middleware.page.CurrentPageMiddleware',
   'cms.middleware.user.CurrentUserMiddleware',
   'cms.middleware.toolbar.ToolbarMiddleware',
   'cms.middleware.language.LanguageCookieMiddleware',

On ajoute également une section TEMPLATE_CONTEXT_PROCESSORS avec les lignes suivantes:

 TEMPLATE_CONTEXT_PROCESSORS = (
     'django.contrib.auth.context_processors.auth',
     'django.core.context_processors.i18n',
     'django.core.context_processors.request',
     'django.core.context_processors.media',
     'django.core.context_processors.static',
     'cms.context_processors.media',
     'sekizai.context_processors.sekizai',
 )

On adapte les chemins statiques pour nos fichiers (css, images, et autres, ...). On se base ici sur une variable définie précédemment PROJECT_PATH.

 STATIC_ROOT = os.path.join(PROJECT_PATH, "static")
 STATIC_URL = "/static/"
 MEDIA_ROOT = os.path.join(PROJECT_PATH, "media")
 MEDIA_URL = "/media/"

On crée les deux répertoires media et static à la racine de notre dossier de projet:

 mkdir media
 mkdir static

Note

Note

Attention il faudra linker les dossiers static des différentq packages python.

Voir chapitre plus bas

Retour dans le fichier settings.py. Toujours pour nos fichiers, mais cette fois-ci dans le cadre de gestion de template, on ajoute à la section TEMPLATE_DIR

 os.path.join(PROJECT_PATH, "templates"),

Et pour finir on défini au moins un fichier de template:

 CMS_TEMPLATES = (
     ('template.html', 'Template principal'),
 )

On crée notre dossier de templates et ainsi que le strict minimum du premier template:

 mkdir templates
 echo "{% placeholder <name> %}" > templates/template.html

On défini la langue pour Django-CMS

 LANGUAGES = [
     ('en', 'English'),
 ]

On peut enfin synchroniser toute l'affaire:

 ./manage.py syncdb --all
 ./manage.py migrate --fake

Les URLs

Editer le fichier urls.py de la manière suivante:

 from django.conf.urls.defaults import *
 from django.conf.urls.i18n import i18n_patterns
 from django.contrib import admin
 from django.conf import settings
 
 admin.autodiscover()
 
 urlpatterns = i18n_patterns(,
     url(r'^admin/', include(admin.site.urls)),
     url(r'^', include('cms.urls')),
 )
 
 if settings.DEBUG:
     urlpatterns = patterns(,
     url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
     url(r, include('django.contrib.staticfiles.urls')),
 ) + urlpatterns

Création des templates

On crée une page base.html dans le dossier des templates avec le contenu suivant:

 {% load cms_tags sekizai_tags %}
 <html>
   <head>
       {% render_block "css" %}
   </head>
   <body>
       {% cms_toolbar %}
       {% placeholder base_content %}
       {% block base_content %}{% endblock %}
       {% render_block "js" %}
   </body>
 </html>

On reprend notre template créer précédement pour le complété comme ceci:

 {% extends "base.html" %}
 {% load cms_tags %}
 
 {% block base_content %}
   {% placeholder template_content %}
 {% endblock %}

static manquant pour /admin et CMS

Les images et les styles pour la pae d'admin et les interfaces de Django-CMS ne s'affichent pas. Il faut copier, et même mieux, faire un lien depuis notre dossier static (encore vide) vers les dossiers de packages correspondants:

 cd static/
 ln -s ../../lib/python2.7/site-packages/django/contrib/admin/static/admin/ admin
 ln -s ../../lib/python2.7/site-packages/cms/static/cms/ cms

Tadaam! Tout devrait revenir dans l'ordre ainsi.

Usage

Draft Draft / Brouillon
Cette page/chapitre est un brouillon, pas un article ou une règle, et peut être incomplète ou non-fiable! Vous êtes invités à faire des suggestions en page de discussion.

La doc officielle de django-CMS est très complète, mais néanmoins pas facile à aborder. La doc présente comment utiliser chaque outils de Django-CMS. Mais à mon sens il manque un description de quel outils utiliser lorsque l'on veut faire quelque chose. C'est dans cette optique là que j'écris ce chapitre Usage.

Page

Placeholder

Les placeholder

 {% placeholder "atricle_content" or %}There is no content.{% endplaceholder %}{% endwith %}

Fix

 {% show_placeholder "sponsor_content" "home" %}

Menu

  <div class="navbar">
      <div class="navbar-inner">
          <div class="container">
              {% load menu_tags %}
              <ul class="nav">
                  {% show_menu 0 100 100 100 %}
              </ul>
          </div>
      </div>
  </div><!-- /.navbar -->