---
title: "Utilitaires Django"
version: 6.0
locale: fr
source: https://docs.djangoproject.com/fr/6.0/ref/utils/
canonical: https://djangodocs.dev/fr/6.0/ref/utils/
---
# Utilitaires Django

Ce document présente tous les modules stables dans `django.utils`.  La plupart des modules dans `django.utils` sont conçus pour un usage interne et seuls les parties documentées ici peuvent être considérées comme stables et donc rétrocompatibles, selon la [politique interne d’obsolescence de publication](/fr/6.0/internals/release-process/#internal-release-deprecation-policy).

## `django.utils.cache`

Ce module contient des fonctions utilitaires pour le contrôle du cache HTTP. Il opère en manipulant l’en-tête `Vary` des réponses. Il contient des fonctions pour modifier directement l’en-tête des objets réponse ainsi que des décorateurs qui modifient les fonctions afin qu’elle se chargent elles-mêmes de la modification des en-têtes.

Pour plus d’informations sur l’en-tête `Vary`, voir la [**RFC 9110 Section 12.5.5**](https://datatracker.ietf.org/doc/html/rfc9110.html#section-12.5.5).

À la base, l’en-tête HTTP `Vary` définit quels en-têtes de requête un cache doit prendre en considération pour générer sa clé de cache. Les requêtes vers un même chemin mais contenant des contenus d’en-tête différents pour les en-têtes mentionnés dans `Vary` ont besoin de produire des clés de cache différentes pour ne pas délivrer de mauvais contenu.

Par exemple, l’intergiciel d’[internationalisation](/fr/6.0/topics/i18n/) doit pouvoir mettre en cache des versions différentes en fonction de l’en-tête `Accept-language`.

#### `patch_cache_control(response, **kwargs)`

Cette fonction complète l’en-tête `Cache-Control` en y ajoutant tous les paramètres nommés. La transformation se fait comme suit :

- Tous les paramètres nommés sont transformés en minuscules et les soulignements sont convertis en tirets.
- Si la valeur d’un paramètre est `True` (exactement `True`, pas seulement une valeur évaluée à `True`), seul le nom du paramètre est ajouté à l’en-tête.
- Tous les autres paramètres sont ajoutés avec leur valeur, après avoir passé par la fonction `str()`.

#### `get_max_age(response)`

Renvoie la valeur `max-age` de l’en-tête de réponse `Cache-Control` sous forme de nombre entier (ou `None` s’il n’existe pas ou qu’il n’est pas un nombre entier).

#### `patch_response_headers(response, cache_timeout=None)`

Ajoute certains en-têtes utiles à l’objet `HttpResponse` donné :

- `Expires`
- `Cache-Control`

Chaque en-tête n’est ajouté que s’il n’est pas déjà présent.

`cache_timeout` est en secondes. Le réglage [`CACHE_MIDDLEWARE_SECONDS`](/fr/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS) est utilisé par défaut.

#### `add_never_cache_headers(response)`

Ajoute un en-tête `Expires` à la date actuelle.

Ajoute un en-tête `Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private` à une réponse pour indiquer que la page ne doit jamais être mise en cache.

Chaque en-tête n’est ajouté que s’il n’est pas déjà présent.

#### `patch_vary_headers(response, newheaders)`

Ajoute (ou met à jour) l’en-tête `Vary` dans l’objet `HttpResponse` donné. `newheaders` est une liste de noms d’en-têtes qui doivent se trouver dans `Vary`. Si les en-têtes contiennent un astérisque, l’en-tête `Vary` consistera en un seul astérisque `'*'`, selon la [**RFC 9110 Section 12.5.5**](https://datatracker.ietf.org/doc/html/rfc9110.html#section-12.5.5). Sinon, les en-têtes existants dans `Vary` ne sont pas enlevés.

#### `get_cache_key(request, key_prefix=None, method='GET', cache=None)`

Renvoie une clé de cache basée sur le chemin de requête. Cette méthode peut être utilisée dans la phase de requête car elle extrait la liste d’en-têtes à prendre en compte à partir du registre global de chemin et utilise ces en-têtes pour construire une clé de cache à utiliser.

Si aucune liste d’en-tête n’est stockée, la page doit être reconstruite et cette fonction renvoie donc `None`.

#### `learn_cache_key(request, response, cache_timeout=None, key_prefix=None, cache=None)`

Apprend quels en-têtes à prendre en compte pour un certain chemin de requête à partir de l’objet réponse. Elle stocke ces en-têtes dans un registre global de chemins afin que tout accès ultérieur à ce chemin sache les en-têtes à prendre en compte sans devoir construire l’objet réponse lui-même. Les en-têtes sont nommés dans l’en-tête `Vary` de la réponse, mais il s’agit d’éviter de devoir générer la réponse.

La liste des en-têtes à utiliser pour la génération de la clé de cache est stockée dans le même cache que les pages elles-mêmes. Si le cache rejette certaines vieilles données du cache, cela signifie qu’il faut reconstruire une fois la réponse pour avoir accès à l’en-tête `Vary` et par là à la liste des en-têtes à utiliser pour la clé de cache.

## `django.utils.dateparse`

Les fonctions définies dans ce module partagent les propriétés suivantes :

- Elles acceptent les chaînes aux formats date/heure ISO 8601 (ou certaines alternatives proches) et renvoient des objets des classes correspondantes du module Python [`datetime`](https://docs.python.org/3/library/datetime.html#module-datetime).
- Elles génèrent une exception [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError) si la valeur d’entrée est correctement mise en forme mais qu’elle ne correspond pas à une date ou heure valable.
- Elles renvoient `None` si la valeur d’entrée n’est pas correctement mise en forme.
- Elles acceptent une résolution de valeur d’entrée jusqu’à la picoseconde, mais elles tronquent à la microseconde car c’est la résolution maximale gérée par Python.

#### `parse_date(value)`

Analyse une chaîne et renvoie un objet [`datetime.date`](https://docs.python.org/3/library/datetime.html#datetime.date).

#### `parse_time(value)`

Analyse une chaîne et renvoie un objet [`datetime.time`](https://docs.python.org/3/library/datetime.html#datetime.time).

Les décalages UTC ne sont pas pris en charge ; si `value` en contient un, le résultat sera `None`.

#### `parse_datetime(value)`

Analyse une chaîne et renvoie un objet [`datetime.datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).

Les décalages UTC sont pris en charge ; si `value` en contient un, l’attribut `tzinfo` du résultat sera une instance [`datetime.timezone`](https://docs.python.org/3/library/datetime.html#datetime.timezone).

#### `parse_duration(value)`

Analyse une chaîne et renvoie un objet [`datetime.timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta).

S’attend à recevoir des données au format `"JJ HH:MM:SS.uuuuuu"`, `"DD HH:MM:SS,uuuuuu"` ou tel que défini par ISO 8601 (par ex. `P4DT1H15M20S` ce qui est équivalent à `4 1:15:20`), ou au format d’intervalle jour-heure de PostgreSQL (par ex. `3 days 04:05:06`).

## `django.utils.decorators`

#### `method_decorator(decorator, name='')`

Convertit un décorateur de fonction en un décorateur de méthode. Cette fonction peut être utilisée pour décorer des méthodes ou des classes ; dans ce dernier cas, `name` est le nom de la méthode à décorer et est obligatoire.

`decorator` peut aussi être une liste ou un tuple de fonctions. Celles-ci sont décorées dans l’ordre inverse, ce qui fait que l’ordre d’appel est le même que celui dans lequel les fonctions apparaissent dans la liste.

Voir [décoration des vues fondées sur les classes](/fr/6.0/topics/class-based-views/intro/#id1) pour un exemple d’utilisation.

#### `decorator_from_middleware(middleware_class)`

Renvoie un décorateur de vue à partir d’une classe d’intergiciel. Cela permet d’utiliser des fonctionnalités d’intergiciel pour certaines vues seulement. L’intergiciel est créé sans aucun paramètre.

Il s’attend à des intergiciels compatibles avec l’ancien style de Django jusqu’à 1.9 (en ayant des méthodes comme `process_request()`, `process_exception()` et `process_response()`).

#### `decorator_from_middleware_with_args(middleware_class)`

Comme `decorator_from_middleware`, mais renvoie une fonction qui accepte des paramètres à transmettre à la classe `middleware_class`. Par exemple, le décorateur [`cache_page()`](/fr/6.0/topics/cache/#django.views.decorators.cache.cache_page) est créé à partir de `CacheMiddleware` comme ceci :

```
cache_page = decorator_from_middleware_with_args(CacheMiddleware)

@cache_page(3600)
def my_view(request):
    pass
```

#### `sync_only_middleware(middleware)`

Marque un intergiciel comme [purement synchrone](/fr/6.0/topics/http/middleware/#async-middleware) (par défaut dans Django, mais cela ajoute une robustesse supplémentaire au cas où la valeur par défaut devait changer dans le futur).

#### `async_only_middleware(middleware)`

Marque un intergiciel comme [purement asynchrone](/fr/6.0/topics/http/middleware/#async-middleware). Django va l’envelopper dans une boucle événementielle asynchrone lorsqu’il est appelé à partir d’un chemin de requête WSGI.

#### `sync_and_async_middleware(middleware)`

Marque un intergiciel comme [compatible synchrone et asynchrone](/fr/6.0/topics/http/middleware/#async-middleware), ce qui évite de devoir convertir les requêtes. Vous devez implémenter la détection du type de requête actuel pour utiliser ce décorateur. Voir la [documentation des intergiciels asynchrones](/fr/6.0/topics/http/middleware/#async-middleware) pour plus de détails.

## `django.utils.encoding`

#### `smart_str(s, encoding='utf-8', strings_only=False, errors='strict')`

Renvoie un objet `str` représentant un objet arbitraire `s`. Traite les chaînes d’octets en utilisant le codage `encoding`.

Si `strings_only` est `True`, ne convertit pas certains objets non assimilables à des chaînes.

#### `is_protected_type(obj)`

Détermine si l’instance d’objet est d’un type protégé.

Les objets d’un type protégé sont préservés tels quels lorsqu’ils sont transmis à `force_str(strings_only=True)`.

#### `force_str(s, encoding='utf-8', strings_only=False, errors='strict')`

Semblable à `smart_str()`, sauf que les instances différées sont évaluées en chaînes, plutôt que de conserver leur état différé.

Si `strings_only` est `True`, ne convertit pas certains objets non assimilables à des chaînes.

#### `smart_bytes(s, encoding='utf-8', strings_only=False, errors='strict')`

Renvoie une version de l’objet arbitraire `s` sous forme de chaîne d’octets, en utilisant le codage indiqué dans `encoding`.

Si `strings_only` est `True`, ne convertit pas certains objets non assimilables à des chaînes.

#### `force_bytes(s, encoding='utf-8', strings_only=False, errors='strict')`

Semblable à `smart_bytes`, sauf que les instances différées sont évaluées en chaînes d’octets, plutôt que de conserver leur état différé.

Si `strings_only` est `True`, ne convertit pas certains objets non assimilables à des chaînes.

#### `iri_to_uri(iri)`

Convertit une portion d’identifiant de ressource internationalisé (IRI) en portion d’URI qui convient pour l’inclusion dans une URL.

Il s’agit de l’algorithme de la section 3.1 de la [**RFC 3987 Section 3.1**](https://datatracker.ietf.org/doc/html/rfc3987.html#section-3.1), légèrement simplifiée dans la mesure où l’on admet que la valeur d’entrée est une chaîne et non pas un flux binaire arbitraire.

Accepte une IRI (chaîne ou octets UTF-8) et renvoie une chaîne contenant le résultat encodé.

#### `uri_to_iri(uri)`

Convertit une URI (Uniform Resource Identifier) en une IRI (Internationalized Resource Identifier).

Il s’agit d’un algorithme inspiré de la section 3.2 de la [**RFC 3987 Section 3.2**](https://datatracker.ietf.org/doc/html/rfc3987.html#section-3.2).

Accepte une URI en octets ASCII et renvoie une chaîne contenant le résultat encodé.

#### `filepath_to_uri(path)`

Convertit un chemin de système de fichiers en une portion d’URI convenable pour son inclusion dans une URL. Le chemin en entrée doit être soit des octets UTF-8, une chaîne ou un chemin [`Path`](https://docs.python.org/3/library/pathlib.html#pathlib.Path).

This method will encode certain characters that would normally be
recognized as special characters for URIs. Note that this method does not
encode the “ character, as it is a valid character within URIs. See
`encodeURIComponent()` JavaScript function for more details.

Renvoie une chaîne ASCII contenant le résultat encodé.

#### `escape_uri_path(path)`

Échappe les caractères non sûrs de la portion de chemin d’un URI (Uniform Resource Identifier).

## `django.utils.feedgenerator`

Exemple d’utilisation :

```pycon
>>> from django.utils import feedgenerator
>>> feed = feedgenerator.Rss201rev2Feed(
...     title="Poynter E-Media Tidbits",
...     link="https://www.poynter.org/tag/e-media-tidbits/",
...     description="A group blog by the sharpest minds in online media/journalism/publishing.",
...     language="en",
... )
>>> feed.add_item(
...     title="Hello",
...     link="https://www.holovaty.com/test/",
...     description="Testing.",
... )
>>> with open("test.rss", "w") as fp:
...     feed.write(fp, "utf-8")
...
```

Pour simplifier la sélection d’un générateur, utilisez `feedgenerator.DefaultFeed` qui est actuellement `Rss201rev2Feed`.

For definitions of the different versions of RSS, see [The myth of RSS
compatibility](https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004/02/04/incompatible-rss).

#### `get_tag_uri(url, date)`

Crée un `TagURI`.

See [How to make a good ID in Atom](https://web.archive.org/web/20110514113830/http://diveintomark.org/archives/2004/05/28/howto-atom-id).

### `Stylesheet`

> **New in Django 5.2**

#### `class Stylesheet(url, mimetype='', media='screen')`

Représente une feuille de style RSS.

#### `url`

Argument obligatoire. L’URL où se trouve la feuille de style.

#### `mimetype`

An optional string containing the MIME type of the stylesheet. If not
specified, Django will attempt to guess it by using Python’s
[`mimetypes.guess_type()`](https://docs.python.org/3/library/mimetypes.html#mimetypes.guess_type). Use `mimetype=None` if you don’t
want your stylesheet to have a MIME type specified.

#### `media`

An optional string which will be used as the `media` attribute of
the stylesheet. Defaults to `"screen"`. Use `media=None` if you
don’t want your stylesheet to have a `media` attribute.

### `SyndicationFeed`

#### `class SyndicationFeed`

Classe de base pour tous les flux de syndication. Les sous-classes doivent implémenter `write()`.

#### `__init__(title, link, description, language=None, author_email=None, author_name=None, author_link=None, subtitle=None, categories=None, feed_url=None, feed_copyright=None, feed_guid=None, ttl=None, stylesheets=None, **kwargs)`

Initialise le flux avec le dictionnaire de métadonnées indiqué, qui s’applique au flux entier.

Tout paramètre nommé supplémentaire passé à `__init__` est stocké dans `self.feed`.

Tous les paramètres doivent être des chaînes, à l’exception de deux :

- `categories` doit être une liste de chaînes.
- `stylesheets` doit être une séquence de chaînes ou d’instances [`Stylesheet`](#django.utils.feedgenerator.Stylesheet).

> **Changed in Django 5.2**
>
> Le paramètre `stylesheets` a été ajouté.

#### `add_item(title, link, description, author_email=None, author_name=None, author_link=None, pubdate=None, comments=None, unique_id=None, categories=(), item_copyright=None, ttl=None, updateddate=None, enclosures=None, **kwargs)`

Ajoute un élément au flux. Tous les paramètres sont censés être des chaînes, sauf `pubdate` et `updateddate` qui doivent être des objets `datetime.datetime`, et `enclosures` qui doit être une liste d’instances `Enclosure`.

#### `num_items()`

#### `root_attributes()`

Renvoie des attributs supplémentaires à ajouter à l’élément racine (c’est-à-dire le flux ou canal). Appelé depuis `write()`.

#### `add_root_elements(handler)`

Ajoute des éléments à l’élément racine (c’est-à-dire le flux ou canal). Appelé depuis `write()`.

#### `add_stylesheets(self, handler)`

> **New in Django 5.2**

Ajoute des informations de feuille de style au document. Appelé à partir de `write()`.

#### `item_attributes(item)`

Renvoie des attributs supplémentaires à placer dans chaque élément du flux.

#### `add_item_elements(handler, item)`

Ajoute des éléments pour chaque élément du flux.

#### `write(outfile, encoding)`

Exporte le flux dans le codage indiqué vers `outfile` qui est un objet de type fichier. Les sous-classes sont censées surcharger cette méthode.

#### `writeString(encoding)`

Renvoie le flux dans le codage indiqué sous forme de chaîne.

#### `latest_post_date()`

Renvoie la dernière date `pubdate` ou `updateddate` parmi tous les éléments du flux. Si aucun de ces attributs n’est trouvé sur aucun élément, la date/heure UTC actuelle est renvoyée.

### `Enclosure`

#### `class Enclosure`

Représente une annexe RSS.

### `RssFeed`

#### `class RssFeed(SyndicationFeed)`

### `Rss201rev2Feed`

#### `class Rss201rev2Feed(RssFeed)`

Spécification : <https://cyber.harvard.edu/rss/rss.html>

### `RssUserland091Feed`

#### `class RssUserland091Feed(RssFeed)`

Spécification : <http://backend.userland.com/rss091>

### `Atom1Feed`

#### `class Atom1Feed(SyndicationFeed)`

Spécification : [**RFC 4287**](https://datatracker.ietf.org/doc/html/rfc4287.html)

## `django.utils.functional`

#### `class cached_property(func)`

Le décorateur `@cached_property` met en cache le résultat d’une méthode ayant un seul paramètre `self` sous forme de propriété. Le résultat en cache persiste aussi longtemps que l’instance, ce qui fait que si l’instance est conservée et que la fonction est appelée une nouvelle fois plus tard, le résultat en cache est renvoyé.

Considérons un cas typique où une vue a besoin d’appeler la méthode d’un modèle pour effectuer un certain calcul avant de placer cette instance de modèle dans le contexte passé au gabarit, et celui-ci a aussi besoin d’appeler la méthode une nouvelle fois :

```
# the model
class Person(models.Model):
    def friends(self):
        # expensive computation
        ...
        return friends

# in the view:
if person.friends():
    ...
```

Et dans le gabarit, vous auriez :

```html+django
{% for friend in person.friends %}
```

`friends()` sera ici appelée deux fois. Puisque les instances `person` dans la vue et dans le gabarit représentent la même instance, décorer la méthode `friends()` avec `@cached_property` permet d’éviter cela

```
from django.utils.functional import cached_property

class Person(models.Model):
    @cached_property
    def friends(self): ...
```

Notez que la méthode étant maintenant devenue une propriété, le code Python doit y accéder de manière adéquate :

```
# in the view:
if person.friends:
    ...
```

La valeur en cache peut être traitée comme n’importe quel autre attribut normal de l’instance :

```
# clear it, requiring re-computation next time it's called
person.__dict__.pop("friends", None)

# set a value manually, that will persist on the instance until cleared
person.friends = ["Huckleberry Finn", "Tom Sawyer"]
```

Because of the way the [descriptor protocol](https://docs.python.org/3/reference/datamodel.html#descriptor-invocation) works, using `del` (or `delattr`) on a
`cached_property` that hasn’t been accessed raises `AttributeError`.

En plus d’offrir des avantages potentiels en terme de performance, `@cached_property` peut garantir que la valeur d’un attribut ne change pas de manière inattendue au cours de la vie d’une instance. Cela pourrait se produire avec une méthode dont le calcul est basé sur `datetime.now()`, ou dans le cas où la base de données est modifiée par une autre processus dans le bref intervalle entre des appels successifs d’une méthode de la même instance.

Vous pouvez créer des propriétés en cache pour des méthodes. Par exemple, si vous avez une méthode coûteuse `get_friends()` et que vous vouliez permettre de l’appeler aussi sans récupérer la valeur en cache, vous pourriez écrire :

```
friends = cached_property(get_friends)
```

Alors que `person.get_friends()` recalcule les amis à chaque appel, la valeur de la propriété en cache persiste tant que vous ne la supprimez pas, comme expliqué ci-dessus :

```
x = person.friends  # calls first time
y = person.get_friends()  # calls again
z = person.friends  # does not call
x is z  # is True
```

#### `class classproperty(method=None)`

Similar to [`@classmethod`](https://docs.python.org/3/library/functions.html#classmethod), the `@classproperty`
decorator converts the result of a method with a single `cls` argument
into a property that can be accessed directly from the class.

#### `keep_lazy(func, *resultclasses)`

Django offre de nombreuses fonctions utilitaires (particulièrement dans `django.utils`) qui acceptent une chaîne comme premier paramètre et font quelque chose avec cette chaîne. Ces fonctions sont utilisées aussi bien par des filtres de gabarit que de façon directe dans du code Python.

Si vous écrivez vous-même des fonctions semblables et que vous devez gérer des traductions, vous serez confronté au problème du traitement du premier paramètre quand il s’agit d’un objet de traduction différée. Il n’est pas souhaitable de le convertir immédiatement en chaîne de caractères, car il se peut que cette fonction soit utilisée en dehors d’une vue (et donc que le réglage de langue du fil d’exécution en cours ne soit pas le bon).

Pour des cas comme celui-là, utilisez le décorateur `django.utils.functional.keep_lazy()`. Il modifie la fonction afin que *si* elle est appelée avec en paramètre une traduction différée, l’évaluation de la fonction est reportée jusqu’au moment où il devient vraiment nécessaire de produire une chaîne.

Par exemple :

```
from django.utils.functional import keep_lazy, keep_lazy_text

def fancy_utility_function(s, *args, **kwargs):
    # Do some conversion on string 's'
    ...

fancy_utility_function = keep_lazy(str)(fancy_utility_function)

# Or more succinctly:
@keep_lazy(str)
def fancy_utility_function(s, *args, **kwargs): ...
```

Le décorateur `keep_lazy()` accepte quelques paramètres supplémentaires (`*args`) indiquant le ou les types renvoyés par la fonction originale. Un cas d’utilisation fréquent est d’avoir des fonctions qui renvoient du texte. Pour celles-ci, passez le type `str` à `keep_lazy` (ou utilisez le décorateur [`keep_lazy_text()`](#django.utils.functional.keep_lazy_text) présenté à la section suivante).

L’emploi de ce décorateur permet d’écrire une fonction et de compter sur la présence d’une vraie chaîne en entrée, puis d’ajouter au final la prise en charge des objets de traduction différée.

#### `keep_lazy_text(func)`

Un raccourci pour `keep_lazy(str)(func)`.

Si vous avez une fonction qui renvoie du texte et que vous souhaitez pouvoir accepter des paramètres dont l’évaluation est différée, utilisez ce décorateur :

```
from django.utils.functional import keep_lazy, keep_lazy_text

# Our previous example was:
@keep_lazy(str)
def fancy_utility_function(s, *args, **kwargs): ...

# Which can be rewritten as:
@keep_lazy_text
def fancy_utility_function(s, *args, **kwargs): ...
```

## `django.utils.html`

En principe, le code HTML doit être construit avec des gabarits Django pour profiter de leur mécanisme d’échappement automatique, en faisant appel aux utilitaires de [`django.utils.safestring`](#module-django.utils.safestring) en cas de besoin. Ce module fournit quelques utilitaires supplémentaires de bas niveau pour l’échappement de code HTML.

#### `escape(text)`

Renvoie le texte donné en codant les esperluettes, les guillemets et les chevrons de manière adaptée au HTML. Le texte en entrée est d’abord forcé en chaîne de caractères et le résultat final est marqué comme sûr avec [`mark_safe()`](#django.utils.safestring.mark_safe).

#### `conditional_escape(text)`

Similar to `escape()`, except that it doesn’t operate on pre-escaped
strings, so it will not double escape.

#### `format_html(format_string, *args, **kwargs)`

Cette fonction est semblable à [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format), sauf qu’elle est destinée à construire des fragments de HTML. Le premier argument `format_string` n’est pas échappé, mais tous les autres arguments, nommés ou pas, sont traités par [`conditional_escape()`](#django.utils.html.conditional_escape) avant d’être transmis à `str.format()`. Finalement, la chaîne résultante est marquée comme sûre avec [`mark_safe()`](#django.utils.safestring.mark_safe).

Dans les cas où il s’agit de produire des petits fragments HTML, cette fonction doit être préférée à l’interpolation de chaîne directe avec `%` ou `str.format()`, car elle applique l’échappement à tous ses paramètres, tout comme le fait le système de gabarit par défaut.

Donc au lieu d’écrire :

```
mark_safe(
    "%s <b>%s</b> %s"
    % (
        some_html,
        escape(some_text),
        escape(some_other_text),
    )
)
```

Il est préférable d’écrire :

```
format_html(
    "{} <b>{}</b> {}",
    mark_safe(some_html),
    some_text,
    some_other_text,
)
```

Ceci présente l’avantage de ne pas devoir appliquer soi-même [`escape()`](#django.utils.html.escape) à chacun des paramètres et de risquer une anomalie ou une vulnérabilité XSS si on en oublie un.

Notez que bien que cette fonction utilise `str.format()` pour effectuer l’interpolation, certaines des options de format fournies par `str.format()` (par ex. les formats de nombre) ne fonctionnent pas, car tous les paramètres sont passés par la moulinette [`conditional_escape()`](#django.utils.html.conditional_escape) qui appelle [`force_str()`](#django.utils.encoding.force_str) sur les valeurs reçues.

#### `format_html_join(sep, format_string, args_generator)`

Une adaptateur de [`format_html()`](#django.utils.html.format_html) conçu pour le cas courant d’un groupe de paramètres devant être mis en forme avec la même chaîne de format, puis combinés avec `sep`. `sep` passe lui-même aussi par [`conditional_escape()`](#django.utils.html.conditional_escape).

`args_generator` should be an iterator that yields arguments to pass to
[`format_html()`](#django.utils.html.format_html), either sequences of positional arguments or mappings
of keyword arguments.

Par exemple, des tuples peuvent être utilisés pour les arguments positionnels :

```
format_html_join(
    "\n",
    "<li>{} {}</li>",
    ((u.first_name, u.last_name) for u in users),
)
```

Ou des dictionnaires peuvent être utilisés pour les arguments nommés :

```
format_html_join(
    "\n",
    '<li data-id="{id}">{id} {title}</li>',
    ({"id": b.id, "title": b.title} for b in books),
)
```

> **Changed in Django 5.2**
>
> Support for mappings in `args_generator` was added.

#### `json_script(value, element_id=None, encoder=None)`

Échappe tous les caractères spéciaux HTML/XML avec leur séquence d’échappement Unicode, afin que leur valeur puisse être utilisée de manière sécurisée avec JavaScript. Elle enveloppe également le JSON échappé dans une balise `<script>`. Si le paramètre `element_id` ne vaut pas `None`, la balise `<script>` reçoit comme paramètre `id` cette valeur. Par exemple :

```pycon
>>> json_script({"hello": "world"}, element_id="hello-data")
'<script id="hello-data" type="application/json">{"hello": "world"}</script>'
```

Le codeur `encoder` qui contient par défaut [`django.core.serializers.json.DjangoJSONEncoder`](/fr/6.0/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder) est utilisé pour sérialiser les données. Voir [sérialisation JSON](/fr/6.0/topics/serialization/#serialization-formats-json) pour plus de détails sur ce sérialiseur.

#### `strip_tags(value)`

Tente de supprimer de la chaîne tout ce qui ressemble à une balise HTML, c’est-à-dire tout ce qui est contenu à l’intérieur de `<>`.

Il n’y a absolument AUCUNE garantie que la chaîne résultante sera vraiment sûre du point de vue HTML. Il ne faut donc JAMAIS marquer comme sûre le résultat d’un appel à `strip_tags` sans l’avoir d’abord échappé, par exemple avec [`escape()`](#django.utils.html.escape).

Par exemple :

```
strip_tags(value)
```

Si `value` vaut `"<b>Joël</b> <button>est</button> une <span>limace</span>"`, la valeur renvoyée sera `"Joël est une limace"`.

Si vous recherchez une solution plus solide, recherchez un outil tiers de nettoyage de HTML.

#### `html_safe()`

La méthode `__html__()` d’une classe aide les gabarits non Django à détecter les classes dont le résultat ne demande pas d’échappement HTML.

Ce décorateur définit la méthode `__html__()` pour la classe décorée en enveloppant `__str__()` dans [`mark_safe()`](#django.utils.safestring.mark_safe). Assurez-vous que la méthode `__str__()` renvoie effectivement du texte qui ne demande pas d’échappement HTML.

## `django.utils.http`

#### `urlencode(query, doseq=False)`

Une version de la fonction Python [`urllib.parse.urlencode()`](https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode) pouvant agir sur des dictionnaires `MultiValueDict` et d’autres valeurs qui ne sont pas des chaînes.

#### `http_date(epoch_seconds=None)`

Met en forme la date/heure en respectant le format de date [**RFC 1123 Section 5.2.14**](https://datatracker.ietf.org/doc/html/rfc1123.html#section-5.2.14) tel que défini par la [**RFC 9110 Section 5.6.7**](https://datatracker.ietf.org/doc/html/rfc9110.html#section-5.6.7) du standard HTTP.

Accepte un nombre à virgule exprimé en secondes depuis le temps Unix initial en UTC, de manière semblable à ce que produit `time.time()`. Si le paramètre est `None`, c’est la date actuelle qui est renvoyée.

Produit une chaîne au format `Wdy, DD Mon YYYY HH:MM:SS GMT`.

#### `content_disposition_header(as_attachment, filename)`

Construit la valeur d’un en-tête HTTP `Content-Disposition` à partir du nom de fichier `filename` donné tel que spécifié par rfc:6266. Renvoie `None` si `as_attachment` vaut `False` et que `filename` vaut `None`, sinon renvoie une chaîne apte à être utilisée dans l’en-tête HTTP `Content-Disposition`.

#### `base36_to_int(s)`

Convertit une chaîne base 36 en nombre entier.

#### `int_to_base36(i)`

Convertit un nombre entier positif en chaîne base 36.

#### `urlsafe_base64_encode(s)`

Code une chaîne d’octets en chaîne base64 pour être utilisée dans les URL, en enlevant d’éventuels signes « égal » finaux.

#### `urlsafe_base64_decode(s)`

Décode une chaîne codée en base64, ajoutant d’éventuels signes « égal » finaux qui pourraient avoir été enlevés.

## `django.utils.module_loading`

Fonctions pour manipuler les modules Python.

#### `import_string(dotted_path)`

Importe un chemin pointé de module et renvoie la classe ou l’attribut désigné par le dernier nom du chemin. Génère `ImportError` si l’importation échoue. Par exemple :

```
from django.utils.module_loading import import_string

ValidationError = import_string("django.core.exceptions.ValidationError")
```

est équivalent à :

```
from django.core.exceptions import ValidationError
```

## `django.utils.safestring`

Fonctions et classes pour travailler avec des « chaînes sûres » : des chaînes qui peuvent être affichées sans crainte sans devoir subir d’échappement HTML. Quand une chaîne est marquée comme « sûre » (safe), cela signifie que le producteur de la chaîne a déjà transformé en entités appropriées les caractères qui ne doivent pas être interprétés par le moteur HTML (par ex. « \< »).

#### `class SafeString`

Une sous-classe de `str` pour des chaînes ayant été explicitement marquées comme « sûres » (plus besoin d’échappement) à des fins d’affichage HTML.

#### `mark_safe(s)`

Marque explicitement une chaîne comme sûre en vue de son affichage (HTML). L’objet renvoyé peut être utilisé partout où une chaîne peut être utilisé.

Cette fonction peut être utilisée plusieurs fois sur la même chaîne.

Peut aussi être utilisé comme décorateur.

Pour la construction de fragments de HTML, il est généralement préférable d’utiliser plutôt [`django.utils.html.format_html()`](#django.utils.html.format_html).

Une chaîne marquée comme sûre redevient non sûre quand elle est modifiée. Par exemple :

```pycon
>>> mystr = "<b>Hello World</b>   "
>>> mystr = mark_safe(mystr)
>>> type(mystr)
<class 'django.utils.safestring.SafeString'>

>>> mystr = mystr.strip()  # removing whitespace
>>> type(mystr)
<type 'str'>
```

## `django.utils.text`

#### `format_lazy(format_string, *args, **kwargs)`

Une version de [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format) pour les cas où `format_string`, `args` ou `kwargs` contiennent des objets différés. Le premier paramètre est la chaîne à mettre en forme. Par exemple :

```
from django.utils.text import format_lazy
from django.utils.translation import pgettext_lazy

urlpatterns = [
    path(
        format_lazy("{person}/<int:pk>/", person=pgettext_lazy("URL", "person")),
        PersonDetailView.as_view(),
    ),
]
```

Cet exemple permet aux traducteurs de traduire une partie de l’URL. Si « person » est traduit en « persona », l’expression régulière va correspondre à `persona/(?P<pk>\d+)/$`, par ex. `persona/5/`.

#### `slugify(value, allow_unicode=False)`

Convertit une chaîne en un « slug » d’URL en :

1. Convertissant en ASCII si `allow_unicode` vaut `False` (par défaut).
2. Convertissant en minuscules.
3. Supprimant les caractères qui ne sont pas alphanumériques, des soulignements, des tirets ou des espaces blancs.
4. Remplaçant tout espace blanc ou répétition de tirets par un seul.
5. Supprimant les caractères blancs, les tirets et les soulignements en début et fin de chaîne.

Par exemple :

```pycon
>>> slugify(" Joel is a slug ")
'joel-is-a-slug'
```

Si vous souhaitez permettre les caractères Unicode, passez `allow_unicode=True`. Par exemple :

```pycon
>>> slugify("你好 World", allow_unicode=True)
'你好-world'
```

## `django.utils.timezone`

#### `get_fixed_timezone(offset)`

Renvoie une instance [`tzinfo`](https://docs.python.org/3/library/datetime.html#datetime.tzinfo) représentant un fuseau horaire avec un décalage UTC fixe.

`offset` est une différence de temps [`datetime.timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) ou un nombre entier en minutes. Utilisez des valeurs positives pour les fuseaux horaires à l’est d’UTC et des valeurs négatives à l’ouest d’UTC.

#### `get_default_timezone()`

Renvoie une instance [`tzinfo`](https://docs.python.org/3/library/datetime.html#datetime.tzinfo) qui représente le [fuseau horaire par défaut](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

#### `get_default_timezone_name()`

Renvoie le nom du [fuseau horaire par défaut](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

#### `get_current_timezone()`

Renvoie une instance [`tzinfo`](https://docs.python.org/3/library/datetime.html#datetime.tzinfo) qui représente le [fuseau horaire en cours](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

#### `get_current_timezone_name()`

Renvoie le nom du [fuseau horaire en cours](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

#### `activate(timezone)`

Définit le [fuseau horaire actif](/fr/6.0/topics/i18n/timezones/#default-current-time-zone). Le paramètre `timezone` doit être une instance d’une sous-classe de [`tzinfo`](https://docs.python.org/3/library/datetime.html#datetime.tzinfo) ou un nom de fuseau horaire.

#### `deactivate()`

Désactive le [fuseau horaire actuel](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

#### `override(timezone)`

This is a Python context manager that sets the [current time zone](/fr/6.0/topics/i18n/timezones/#default-current-time-zone) on entry with [`activate()`](#django.utils.timezone.activate), and restores
the previously active time zone on exit. If the `timezone` argument is
`None`, the [current time zone](/fr/6.0/topics/i18n/timezones/#default-current-time-zone) is unset
on entry with [`deactivate()`](#django.utils.timezone.deactivate) instead.

`override` est aussi utilisable comme décorateur de fonction.

#### `localtime(value=None, timezone=None)`

Convertit un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) conscient vers un fuseau horaire différent, par défaut le [fuseau horaire actif](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

Lorsque `value` est omise, la valeur par défaut est [`now()`](#django.utils.timezone.now).

Cette fonction ne fonctionne pas avec des objets date/heure naïfs ; utilisez alors plutôt [`make_aware()`](#django.utils.timezone.make_aware).

#### `localdate(value=None, timezone=None)`

Utilise [`localtime()`](#django.utils.timezone.localtime) pour convertir un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) conscient en une [`date()`](https://docs.python.org/3/library/datetime.html#datetime.datetime.date) dans un fuseau horaire différent, par défaut le [fuseau horaire actif](/fr/6.0/topics/i18n/timezones/#default-current-time-zone).

Lorsque `value` est omise, la valeur par défaut est [`now()`](#django.utils.timezone.now).

Cette fonction ne fonctionne pas avec des objets date/heure naïfs.

#### `now()`

Renvoie un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) représentant le moment actuel dans le temps (« maintenant »). La valeur précisément renvoyée dépend de la valeur de [`USE_TZ`](/fr/6.0/ref/settings/#std-setting-USE_TZ):

- Si [`USE_TZ`](/fr/6.0/ref/settings/#std-setting-USE_TZ) est `False`, il s’agira d’une date/heure [naïve](/fr/6.0/topics/i18n/timezones/#naive-vs-aware-datetimes) (c’est-à-dire une date/heure sans fuseau horaire associé) représentant le temps actuel dans le fuseau horaire local du système.
- Si [`USE_TZ`](/fr/6.0/ref/settings/#std-setting-USE_TZ) est `True`, il s’agira d’une date/heure [consciente](/fr/6.0/topics/i18n/timezones/#naive-vs-aware-datetimes) représentant le temps actuel en UTC. Notez que [`now()`](#django.utils.timezone.now) renvoie toujours le temps UTC quelle que soit la valeur de [`TIME_ZONE`](/fr/6.0/ref/settings/#std-setting-TIME_ZONE); vous pouvez utiliser [`localtime()`](#django.utils.timezone.localtime) pour obtenir l’heure dans le fuseau horaire actif.

#### `is_aware(value)`

Renvoie `True` si `value` est consciente, `False` si elle est naïve. Cette fonction présuppose que `value` est un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).

#### `is_naive(value)`

Renvoie `True` si `value` est naïve, `False` si elle est consciente. Cette fonction présuppose que `value` est un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).

#### `make_aware(value, timezone=None)`

Renvoie un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) conscient représentant le même moment dans le temps que `value` dans le fuseau `timezone`, `value` étant un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) naïf. Si `timezone` est défini à `None`, il prend le [fuseau horaire actuel](/fr/6.0/topics/i18n/timezones/#default-current-time-zone) comme valeur par défaut.

#### `make_naive(value, timezone=None)`

Renvoie un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) naïf représentant le même moment dans le temps que `value` dans le fuseau `timezone`, `value` étant un objet [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) conscient. Si `timezone` est défini à `None`, il prend le [fuseau horaire actuel](/fr/6.0/topics/i18n/timezones/#default-current-time-zone) comme valeur par défaut.

## `django.utils.translation`

Pour une discussion complète sur l’utilisation de ce qui suit, consultez la [documentation sur la traduction](/fr/6.0/topics/i18n/translation/).

#### `gettext(message)`

Traduit `message` et renvoie le résultat dans une chaîne.

#### `pgettext(context, message)`

Traduit `message` selon `context` et renvoie le résultat dans une chaîne.

Pour plus d’informations, voir [Marqueurs contextuels](/fr/6.0/topics/i18n/translation/#contextual-markers).

#### `gettext_lazy(message)`

#### `pgettext_lazy(context, message)`

Même comportement que les versions non différées ci-dessus, mais en utilisant une exécution différée.

Voir [la documentation sur les traductions différées](/fr/6.0/topics/i18n/translation/#lazy-translations).

#### `gettext_noop(message)`

Marque les chaînes en vue de leur traduction mais ne les traduit pas sur le moment. Cela peut être utile pour stocker des chaînes qui doivent rester dans la langue de base (parce qu’elles pourraient être utilisées de manière externe) dans des variables globales et que ces chaînes seront traduites plus tard.

#### `ngettext(singular, plural, number)`

Traduit `singular` et `plural` et renvoie la chaîne appropriée en fonction de `number`.

#### `npgettext(context, singular, plural, number)`

Traduit `singulier` et `pluriel` et renvoie la chaîne appropriée en fonction de `nombre` et de `context`.

#### `ngettext_lazy(singular, plural, number)`

#### `npgettext_lazy(context, singular, plural, number)`

Même comportement que les versions non différées ci-dessus, mais en utilisant une exécution différée.

Voir [la documentation sur les traductions différées](/fr/6.0/topics/i18n/translation/#lazy-translations).

#### `activate(language)`

Récupère le catalogue de traduction d’une langue donnée et l’active comme catalogue de traduction courant pour le fil d’exécution en cours.

#### `deactivate()`

Désactive le catalogue de traduction actif afin que des appels à \_ subséquents vont refaire appel au catalogue de traduction par défaut.

#### `deactivate_all()`

Place une instance de `NullTranslations()` comme catalogue de traduction actif. Cela peut être utile si l’on souhaite que des traductions différées apparaissent avec leur chaîne originale (donc non traduite) pour une raison quelconque.

#### `override(language, deactivate=False)`

Un gestionnaire de contexte Python qui utilise [`django.utils.translation.activate()`](#django.utils.translation.activate) pour récupérer le catalogue de traduction d’une langue données, qui l’active comme catalogue de traduction pour le fil d’exécution en cours et qui réactive la langue précédemment active lors de sa sortie. Il est possible de définir le paramètre `deactivate` à `True` si l’on souhaite que la langue de traduction temporaire soit désactivée à la sortie du gestionnaire avec [`django.utils.translation.deactivate()`](#django.utils.translation.deactivate). Si le paramètre `language` vaut `None`, une instance de `NullTranslations()` est activée dans le code affecté par le gestionnaire de contexte.

`override` est aussi utilisable comme décorateur de fonction.

#### `check_for_language(lang_code)`

Contrôle s’il existe un fichier de langue global pour le code de langue donné (par ex. “fr”, “pt\_BR”). Ceci est utilisé pour décider si une langue demandée par un utilisateur est disponible.

`lang_code` has a maximum accepted length of 500 characters. `False`
is returned if it exceeds this limit, before any language-file lookup.

#### `get_language()`

Returns the currently selected language code. Returns `None` if
translations are temporarily deactivated (by [`deactivate_all()`](#django.utils.translation.deactivate_all) or
when `None` is passed to [`override()`](#django.utils.translation.override)).

#### `get_language_bidi()`

Renvoie l’agencement bidirectionnel de la langue sélectionnée :

- `False` = agencement de gauche à droite
- `True` = agencement de droite à gauche

#### `get_language_from_request(request, check_path=False)`

Analyse la requête pour trouver quelle est la langue souhaitée par l’utilisateur. Seules les langues figurant dans `settings.LANGUAGES` sont prises en compte. Si l’utilisateur demande un sous-code de langue alors que seule la langue principale est disponible, c’est la langue principale qui est renvoyée.

Si `check_path` vaut `True`, la fonction examine d’abord l’URL demandée pour voir si son chemin commence par un code de langue figurant dans le réglage [`LANGUAGES`](/fr/6.0/ref/settings/#std-setting-LANGUAGES).

#### `get_supported_language_variant(lang_code, strict=False)`

Renvoie `lang_code` s’il figure dans le réglage [`LANGUAGES`](/fr/6.0/ref/settings/#std-setting-LANGUAGES), en choisissant potentiellement une variante plus générique. Par exemple, “es”\` est renvoyé si `lang_code` est `'es-ar'` et que `'es'` se trouve dans [`LANGUAGES`](/fr/6.0/ref/settings/#std-setting-LANGUAGES) mais pas `'es-ar'`.

La longueur maximale de `lang_code` est de 500 caractères. Une exception [`LookupError`](https://docs.python.org/3/library/exceptions.html#LookupError) est générée si `lang_code` dépasse cette limite et que `strict` est `True`, ou s’il n’existe pas de variante générique et que `strict` est `False`.

Si `strict` vaut `False` (valeur par défaut), une variante territoriale peut être renvoyée lorsque ni le code de langue, ni sa variante générique n’est trouvée. Par exemple, si seul `'es-co'` se trouve dans [`LANGUAGES`](/fr/6.0/ref/settings/#std-setting-LANGUAGES), c’est ce dernier qui est renvoyé pour les codes de langue comme `'es'` et `'es-ar'`. Ces correspondances ne sont pas renvoyées quand `strict=True`.

Génère [`LookupError`](https://docs.python.org/3/library/exceptions.html#LookupError) si rien n’est trouvé.

#### `to_locale(language)`

Transforme un nom de langue (en-us) en un nom de locale (en\_US).

#### `templatize(src)`

Transforme un gabarit Django en un contenu analysable par `xgettext`. Ce processus traduit les balises de traduction de Django en invocations de fonctions `gettext` standard.
