Ce tutoriel se décompose ainsi :
- Création de l’environnement virtuel pour le projet
- Création et configuration du projet
- Création d’un challenge captcha personnalisé
- Création des routes
- Définition du formulaire
- Création de la vue et du template
Création de l’environnement virtuel pour le projet
Tout d’abord, commençons par installer pip et virtualenv.
sudo apt-get install pip sudo pip install virtualenv
On crée l’environnement virtuel.
virtualenv venv-django-1.8
Puis, on s’y connecte.
cd venv-django-1.8 source bin/activate
On installe les paquets requis.
pip install Django==1.8 pip install django-simple-captcha
Création du projet
On crée la structure du projet.
#venv-django1.8 django-admin startproject django_captcha_test cd django_captcha_test/ python manage.py startapp project cd project mkdir -p templates/project
On configure Django dans settings.py.
Ajoutons les apps captcha et project dans INSTALLED_APPS ainsi que ‘DIRS’: [‘templates’] dans TEMPLATES.
Configuration du projet
Passons maintenant à la configuration
CAPTCHA_CHALLENGE_FUNCT vous permet de modifier le défi pour valider le captcha.
3 défis sont proposés initialement dans la documentation:
L’utilisateur doit saisir la suite de caractères affichée aléatoirement
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
L’utilisateur doit saisir le résultat de l’opération mathématique affiché
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
L’utilisateur doit recopier le mot affiché => ‘captcha.helpers.word_challenge’
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.word_challenge'
Il est également possible de créer son propre challenge !! 🙂
Vous pouvez spécifier n’importe quelle fonction dans CAPTCHA_CHALLENGE_FUNCT à condition quelle retourne un tuple de chaine de caractères.
Pour l’exemple, créons un fichier helpers.py dans project et ajoutons le code suivant :
#project/helpers import random def emoji_challenge(): emojis = ((':-)',':-)'),(':-(',':-('),(':-D',':-D'),(':-O',':-O')) x = tuple(emojis) ret = random.choice(x) return ret
Cette méthode retourne un tuple (‘: – )’,’: – )’) aléatoire composé du captcha et de la réponse.
Le captcha sera validé si la réponse est égale au texte affiché.
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_arcs','captcha.helpers.noise_dots')
CAPTCHA_NOISE_FUNCTIONS nous permet d’ajouter du grain à l’image pour rendre plus difficile la lecture de 2 manières :
- en traçant des arcs de cercle au hasard dans l’image => ‘captcha.helpers.noise_arcs’
- en ajoutant des points aléatoirement sur l’image => ‘captcha.helpers.noise_dots’
Nous pouvons facilement retirer un effet en remplaçant l’élément du tuple avec ‘captcha.helpers.noise_null’
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null','captcha.helpers.noise_dots')
Les autres paramètres de configuration :
# Nombre de minutes avant timeout CAPTCHA_TIMEOUT = 1 #Lisse l'image, si le défi "chaine de caractère aléatoire" est utilisé CAPTCHA_FILTER_FUNCTIONS = ('captcha.helpers.post_smooth',) CAPTCHA_FONT_SIZE = 18 CAPTCHA_BACKGROUND_COLOR = '#A426B7' CAPTCHA_FOREGROUND_COLOR = 'white' CAPTCHA_IMAGE_SIZE = (100,50) #Inclinaison des premièrs symboles et du dernier CAPTCHA_LETTER_ROTATION = (-35,35)
Création des routes
On crée une route vers l’application project dans django_captcha_test/urls.py
urlpatterns += patterns('', url(r'^captcha/', include('captcha.urls')), url(r'', include('project.urls')), )
On crée un fichier urls.py dans project puis on ajoute le contenu suivant
#project/urls.py from django.conf.urls import patterns, url, include from project import views urlpatterns = patterns('', url(r'',views.index), )
Définition du formulaire
On crée le fichier forms.py dans project et un formulaire contenant le champs captcha à l’intérieur
#project/forms.py from django import forms from captcha.fields import CaptchaField from django.contrib.auth.models import User class CaptchaTestForm(forms.Form): captcha = CaptchaField()
Création de la vue et du template
On définit la vue index pour tester
#project/views.py from django.shortcuts import render from .forms import CaptchaTestForm def index(request): if request.POST: form = CaptchaTestForm(request.POST) if form.is_valid(): print "Form valid !!!" else: form = CaptchaTestForm() return render(request,'project/index.html',{'form':form}) #templates/project/index.html
On teste le projet accessible à http://localhost:8000/
Si la réponse saisie est valide, vous pouvez voir « Form Valid !! » s’affichait en console.
Félicitations, le tutoriel est terminé.
Vous savez à présent définir un captcha pour sécuriser vos formulaires.
La sources utilisée : django-captcha doc