1. A propos du module slugify
Le module slugify en Python est utilisé pour convertir une chaîne de caractères en un slug — c’est-à-dire une version "propre" et URL-friendly d’un texte. Ce genre de format est couramment utilisé dans les adresses URL de sites web pour représenter un titre d'article ou un nom de page.
Exemple de transformation
- Chaîne originale : "Les bases de Python : Cours #1 !"
- Résultat après slugification : "les-bases-de-python-cours-1"
2. Installation & usage
2.1 Installation
1 |
pip install python-slugify |
Il existe d'autres modules similaires comme slugify de Django ou awesome-slugify, mais ici nous parlons du module python-slugify.
2.2 Utilisation de base
1 2 3 4 5 |
from slugify import slugify text = "Les bases de Python : Cours #1 !" slug = slugify(text) print(slug) # Output: les-bases-de-python-cours-1 |
3. Options disponibles du module slugify
Le module slugify propose plusieurs options via des arguments :
3.1 separator
Pour changer le séparateur (par défaut -) :
1 2 |
slugify("Cours Python 2025", separator="_") # Output: cours_python_2025 |
3.2 lowercase
Contrôle la conversion en minuscules :
1 2 |
slugify("Un Texte EN MAJUSCULES", lowercase=False) # Output: Un-Texte-EN-MAJUSCULES |
3.3 max_length
Limite la longueur du slug :
1 2 |
slugify("Ce titre est vraiment trop long pour une URL", max_length=20) # Output: ce-titre-est-vraime |
3.4 only_ascii
Convertit les caractères non ASCII :
1 2 |
slugify("François à l'école", only_ascii=True) # Output: francois-a-l-ecole |
4. Principaux usages du module slugify
- Génération d’URL pour les blogs ou les CMS
- Nom de fichiers
- Clés dans une base de données
- Organisation de répertoires
Exemple complet
1 2 3 4 5 6 |
from slugify import slugify titre = "Développement Web: HTML, CSS & JavaScript !" slug = slugify(titre, separator='-', lowercase=True, max_length=50, only_ascii=True) print(slug) # Output: developpement-web-html-css-javascript |
5. Exemple d’intégration dans un projet Flask ou Django
Au sein de Flask ou django, on a souvent besoin de slugifier une chaine de caractères pour générer une adresse url ou nom d'un fichier...Voici un exemple d'intégration du module slugify dans deux contextes : Flask et Django, pour générer un slug automatiquement à partir d’un titre d’article.
5.1 Exemple avec Flask
Supposons que vous créez un blog avec Flask, et vous voulez générer un slug pour chaque article lors de sa création.
Structure simplifiée:
1 2 3 |
/monblog/ ├── app.py ├── models.py |
app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
from flask import Flask, request, jsonify from slugify import slugify app = Flask(__name__) @app.route('/ajouter-article', methods=['POST']) def ajouter_article(): data = request.json titre = data.get("titre") slug = slugify(titre) # Simuler un enregistrement (ici, retour JSON) return jsonify({"titre": titre, "slug": slug}) if __name__ == '__main__': app.run(debug=True) Test avec requête POST : { "titre": "Mon premier article !" } Réponse : { "titre": "Mon premier article !", "slug": "mon-premier-article" } |
5.2 Exemple avec Django
Dans un projet Django, on peut créer le slug automatiquement dans le modèle.
models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from django.db import models from slugify import slugify class Article(models.Model): titre = models.CharField(max_length=200) contenu = models.TextField() slug = models.SlugField(unique=True, blank=True) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.titre) super().save(*args, **kwargs) def __str__(self): return self.titre |
Le champ slug est généré automatiquement à partir du champ titre lors du save().
5.3 Exemple d’utilisation dans l’admin Django
Lorsque vous ajoutez un article avec le titre :
- Apprendre Django en 10 jours !
- Le slug généré sera :
- apprendre-django-en-10-jours
5.4 Générer un slug unique en Django
Si vous voulez être sûr que le slug est unique, même si deux articles ont le même titre :
1 2 3 4 5 6 7 8 |
import uuid def save(self, *args, **kwargs): if not self.slug: base_slug = slugify(self.titre) unique_id = str(uuid.uuid4())[:8] self.slug = f"{base_slug}-{unique_id}" super().save(*args, **kwargs) |
Younes Derfoufi
CRMEF OUJDA