Fantomas’side

Weblog open-source

Tag archives: django

RSS feed of django

Stop aux spams sur django.contrib.comments

Depuis quelques jours, les formulaires de commentaires fournis par l'application django.contrib.comments dans la distribution de Django, sont devenus vulnérables aux spams.

L'application comments contient par défauts plusieurs sécurités pour éviter le spamming, comme un honeypot et la vérification du temps de saisie du commentaires.

Malgré cela les équipes de spammer sont très réactives, et coder un bot spécifique pour les sites django utilisant ce système de commentaires, rend tous ces sites vulnérables.

En parallèle de cela, dans la version 1.1b de Django, l'application comments acquiert une nouvelle fonctionnalité, qu'est la modération automatique. L'envois de mails en cas de commentaires, et aussi prise en charge.

J'en ai donc profité pour développer une protection contre le spam plus efficace basée sur Akismet à partir de cette nouvelle fonctionnalité.

"""Moderator of Entry comments
   Based on Akismet for checking spams
   Need to override the default Moderator,
   for getting request in parameters."""
from django.conf import settings
from django.utils.encoding import smart_str
from django.contrib.sites.models import Site
from django.db.models import signals
from django.contrib import comments
from django.contrib.comments.signals import comment_will_be_posted
from django.contrib.comments.moderation import Moderator
from django.contrib.comments.moderation import CommentModerator

from django.conf.settings import MAIL_COMMENT
from django.conf.settings import AKISMET_COMMENT

AKISMET_API_KEY = getattr(settings, 'AKISMET_API_KEY', '')

class EntryCommentModerator(CommentModerator):
    """Moderate the comment of Entry"""
    email_notification = MAIL_COMMENT
    enable_field = 'comment_enabled'

    def email(self, comment, content_object):
        if comment.is_public ...

Continue reading

Un CMS en Django ? la suite

Ces derniers temps occupé par certains projets personnels, j'ai pu tester de nouveaux outils de développement. L'idée est d'en faire un retour et je vais commencer par la suite de mon dernier article.

La dernière fois je vois ai parlé d'une des premières applications disponible en Django permettant d'intégrer un CMS dans son site, nommé Django-cms. Mais mon retour sur cette application m'avait laissé un petit goût de frustration, me laissant penser que ce n'étais pas encore au point. Mais cela va mieux avec Django-page-cms. :)

Ce dernier en plus des fonctionnalités essentielles, comme la gestion de l'arborescence dans le module d'administration et la prise en charge de différents langages, possède certains atouts qui en font mon favoris.

Voici les petits plus qui m'ont séduit :

  • Définition de plusieures zones de contenus dans un template. (trop fort !)
  • Surcharge des urls existante dans le CMS. (enfin !)
  • Possibilité d'édition du contenu directement depuis le Front. (la classe !)
  • Les contenus du CMS peuvent être interprétés en temps que code. (super !)
  • Pas de besoin de définir une "RootPage" comme dans Django-cms.
  • Gestion des révisions.
  • Code propre.

De plus j'ai pu tester la rapidité de l'équipe du projet qui a intégré en moins de 12h ma contribution pour fixer un bug mineur.

Un projet qui mérite donc d'être suivis.

Le site de web de Django-pages-cms.

Edit du 7 avril 2009 : une traduction en français est désormais disponible, ou ici.

Un CMS en Django ?

Depuis la sortie 1.0 de Django, nombre d'applications plus ou moins complètes ont vu le jour. Mais il manquait encore une application de type CMS qui soit vraiment complète et professionnelle.

Les fonctionnalités principales d'un CMS seraient de pouvoir créer facilement une arborescence, l'intégration des principaux DublinCore et surtout d'avoir un support pour l'internationalisation notamment au niveau des urls.

Après plusieurs recherches et tests des différentes applications destinées à ce but, un projet sort du lot. Son nom, Django-CMS, dont la page du projet se situe ici.

Django-CMS avec son interface en Javascript pour organiser les pages en Drag and drop et l'implémentation de toutes les fonctionnalités précèdemment citées font de lui un sérieux concurrent dans le monde des CMS en Django. Je décide donc de le tester et d'en faire ces quelques retours.

Points Positifs

Gestion la localisation des URL/IRI, en effet il est possible d'attribuer une IRI sur une page. Très pratique pour pouvoir gérer du contenu dans plusieurs langues.

Intégration avec TInyMCE basé sur le projet Django-TinyMCE ce qui vous permettra d'ajouter facilement un WYSIWYG à l'édition de vos pages.

Intégration avec Django-FileBrowser. FileBrowser est une application Django qui permet d'envoyer et d'administrer des fichiers depuis l'interface d'administration. Une application très pratique, surtout qu'elle fournit un binding pour l'envoi de fichier avec TinyMCE.

L'administration du CMS est classe et parfaitement bien intégrée dans le module d'administration de ...

Continue reading

Changer son thème d'administration Django

Je sais pas pour vous, mais l'administration de Django, je peux plus la voir. :) 

Même si elle reste très jolie est bien pensée, ses teintes bleues me sortent par les yeux, et je voulais en changer.

Je me suis penché sur la question en me disant qu'il était largement possible d'effectuer un changement, au minimum des teintes. Mais n'étant pas graphiste et estimant la charge de travail à fournir, j'ai abandonné cette idée.

Mais je suis récemment tombé sur un projet intéressant appelé django-grappelli. Le but étant de fournir une alternative aux templates et au style appliqué dans le module d'administration de Django, exactement ce que je recherchais.

De plus le graphisme m'a tout de suite semblé très clair et soigné, je me suis laissé donc conquérir par ce thème. Quelques screenshots ici. Le petit plus de ce projet, c'est le fait de pouvoir facilement insérer ses propres liens en raccourcis dans l'administration. Un must.

Par contre il existe un gros bémol avec ce thème, son installation.
D'après les explications de la documentation, les templates et les médias doivent se substituer à ceux originalement fournis dans la distribution de Django.

Donc en plus de vous conseiller d'installer ce module, je vais vous détailler comment l'installer de manière moins intrusive et donc plus propre. :)

Le projet étant composé de 2 dossiers, templates et media, il faut s'arranger pour que Django utilise ces 2 dossiers pour effectuer le ...

Continue reading

Intégrer Twitter dans Django

Twitter, c'est le nouveau média à la mode pour lancer le buzz.
Créer en 2006, son but est simple, pouvoir résumer à tout instant, ce que l'on fait, ce que l'on pense, par des messages courts, que l'on envois par SMS. En effet les messages ne doivent pas dépasser 140 caractères.

De plus votre réseau peut suivre instantanément vos status, enfin bref voilà le Micro-Blogging d'inventé.

Twitter fournis une API pour pouvoir communiquer avec son service. Je me suis alors demandé ce que je pouvais en faire, et ait décidé d'interfacer celle ci avec Django.

A travers un exemple nous allons voir comment récupérer des informations de Twitter avec les Templatetags Django.

Première étape, installer l'excellente API python pour Twitter disponible sur GoogleCode.

Ensuite nous allons créer un module python disponible dans le PYTHON_PATH, que nous appellerons django-twitter, et y créer un templatetag qui récupèrera nos derniers status postés.

$ mkdir -p django-twitter/templatetags
$ cd django-twitter
$ touch __init__.py
$ cd templatetags
$ touch __init__.py
$ touch get_tweets.py

Ceci va nous créer la structure pour y intégrer notre code. Nous allons maintenant éditer le fichier get_tweets.py et y insérer le code suivant :

"""Templates tags for accessing to Twitter"""
from django.conf import settings
from django.core.cache import cache
from django.template import Library, Node
from twitter import Api

register = Library()

class TweetStatusNode(Node):
    def __init__(self, num, varname):
        self.num = int(num)
        self.varname = varname
        self.key = '%s-%s' % (self.num, self.varname ...

Continue reading

Distribuer une application Django en moins de 5 minutes

Vous venez de finir votre dernière application en Django, qui se veut réutilisable et distribuable. Félicitations :).

Désormais vous voulez automatiser l'installation et la distribution du paquet, et pourquoi pas le rendre installable facilement en 1 ligne de commande, sous la forme d'eggs.

Le plus simple est de réaliser un script d'installation basé sur distutils qui permettra de télécharger et d'installer le code en quelques secondes. L'idée est de paqueter le module à distribuer avec un script nommé setup.py se chargeant de l'installation.

Mais réaliser ce script est parfois assez contraignant et long, surtout ex nihilo...

Pour cela nous allons utiliser PasteScript et un jeu de templates pour Django pour nous créer automatiquement la structure du script.

Prérequis

Désormais on va créer la structure du package avec cette commande :

$ paster create -t django_app mon_application

Plusieurs questions importantes vous seront posées pour créer la structure de votre distribution, répondez soigneusement.

Désormais dans ce dossier nous avons un fichier setup.py et un dossier mon_application. Le template utilisé crée automatiquement des fichiers pour réaliser une application Django. C'est là où il vous faut mettre votre code.

Maintenant éditez votre fichier setup.py pour le personnaliser un peu.

Grâce aux commandes intégrées vous pouvez distribuer votre application facilement.

Pour l'enregistrer sur Pypi et le rendre disponible via easy_install :

$ python setup.py sdist bdist_egg register upload

Pour installer votre application il suffit désormais de faire :

$ easy_install mon_application

Ou ...

Continue reading

Django unique et timed sessions

Comment rendre unique les comptes utilisateurs connectés sur un site en Django ?

Ce genre de problématique se retrouve souvent sur les sites internet proposant des abonnements à un service en ligne, voulant empêcher le partage d'abonnement.

Pour les besoins d'un projet spécifique en Django au sein de la société Emencia là où je travaille, j'ai du développer un moyen d'empêcher 2 utilisateurs de se connecter sur un compte utilisateur en même temps.

Mais le problème ne s'arrête pas là, comment empêcher la connection et la déconnection successive entre 2 utilisateurs ? L'idée est de donner un temps minimum de connection à chaque session ouverte pour empêcher la déconnection, par exemple 5 minutes.

Pour cela j'ai écrit un Middleware pour Django qui va se charger de rendre unique chaque sessions utilisateurs sur le site. Utiliser un middleware donne l'avantage d'être réutilisable et facile à installer.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'utsessions.middleware.UTSessionMiddleware',
    )

Après plusieurs refactorings et tests, permettant de configurer le comportement du middleware, comme la déconnection automatique, j'ai publier le code source sur GoogleCode pour que tout le monde puisse en profiter.

Pour plus d'informations, ou pour télécharger le code, consulter le site web du projet : Django UT Sessions.

Pour installer le module depuis Pypi :

$ easy_install utsessions

Clustered Models

Je vous parlais récemment de l'application Django Clustered Sitemap, servant à établir la correspondance entre 2 objets sur des projets Django.

Après une review globale du code et l'ajout de certaines fonctionnalités, j'ai changé le nom du projet en Clustered models car il ne correspondait plus vraiment à la philosophie du projet.

La première modification à été d'ajouter une nouvelle version du sitemap, mais cette fois ci en nuage 2D.

Le code et les vues ont été rendu génériques pour en faciliter l'intégration et l'extensibilité.
Une feature intéressante est qu'il est possible de réutiliser la configuration des vues générique pour effectuer des groupements.

Ensuite un templatetag à été ajouté pour pouvoir voir les models associés à un autre model. Le résultat est qu'il est désormais possible de voir les articles associés sur le blog. :)

Le tout étant très facile à installer, voici un exemple du code pour réaliser mes sitemaps mélant les flatpages et les articles, dans le fichier urls.py du projet.

from clustered_models import VectorBuilder
from clustered_models.clusterers import DimensionalClusterer
from clustered_models.clusterers import HierarchicalClusterer from django.contrib.flatpages.models import FlatPage

entry_conf = {'queryset': Entry.published.all(), 'fields': ['content', 'title', 'excerpt']}
flatpage_conf = {'queryset': FlatPage.objects.all(),
'fields': ['title', 'content']}

vector = VectorBuilder(entry_conf, flatpage_conf)

urlpatterns += patterns(
'',
url(r'^sitemap/$', 'clustered_models.views.clustered_view',
{'vector': vector, 'clusterer': HierarchicalClusterer}),
url(r'^cloud-sitemap/$', 'clustered_models.views.clustered_view',
{'vector': vector, 'clusterer': DimensionalClusterer})
)

Je ne releaserais le module que si il y a un minimum d'intérêt pour ...

Continue reading

Clustered Sitemap

Comme je vous en parlais dans mon précèdent article, je comptais faire quelque chose d'utile tiré de l'intelligence collective.
J'ai donc intégré une partie du code de mon projet Feed Clusterer pour en faire un module Django.

L'idée est de reprendre la configuration des vues génériques, et de spécifier les champs à inspecter pour effectuer une correspondance. Cette correspondance servira à l'établissement d'une cartographie des différentes vues d'un site en Django.

En modélisant ces données sous la forme d'un dendogramme on peut avoir un sitemap assez surprenant, que l'on peut retrouver sur la rubrique Carte en haut du site. Les regroupements se font à la fois sur les thèmes abordés, comme la programmation, ou les restaurants, tout en mélangeant les styles d'écritures et les catégories utilisées.

Cela permet de pouvoir orienter le visiteur vers les articles connexes du site, sans avoir à établir de relations aux préalables :). Regardez la section ou je parle d'Ogame cela suit ma logique de développement et regroupe à chaque fois l'article le plus proche.
Saisissant non ?

Concernant l'effet d'arbre dépliables, je tiens à en remercier l'auteur du site bassistance.de, qui a fait un travail excellent en se basant sur JQuery, un must !

Si le projet vous intéresse, je peux le releaser, il me reste que peu de travail pour le rendre générique.