Skip to content

Latest commit

 

History

History
122 lines (84 loc) · 3.13 KB

bottle-cache-requetes.md

File metadata and controls

122 lines (84 loc) · 3.13 KB

Bottle : Un cache pour les requêtes

Bottle est un framework web écrit en Python. Nous allons voir comment ajouter un cache à certaines requêtes.

Partons de cet exemple inspiré de la description du projet sur GitHub :

:caption: app.py
:linenos:
:lines: 5,107-115
:language: python

Démarrons le serveur local :

python app.py

Et voyons que ça fonctionne :

:caption: $ curl 'http://localhost:8080/hello/Mickaël'

<b>Hello Mickaël</b>

Le Cache

L'idée est la suivante : lorsqu'une requête est faite sur /hello/NAME, la réponse doit être enregistrée pour un usage ultérieur. La prochaine fois que ce même appel aura lieu, la version en cache sera servie directement.

Le cache en lui-même aura besoin de ces fonctions (c'est une façon de faire, à adapter selon le besoin) :

:caption: Imports & constante
:lines: 1-3,6-7
:pyobject: get_from_cache
:language: python
:pyobject: store_in_cache
:language: python

Bien sûr, qui dit cache, dit invalidation de cache. Cette fonction sera utile donc :

:pyobject: invalidate_caches
:language: python

Et voici le code du cache, qui n'est autre qu'un décorateur :

:pyobject: cache
:language: python

La clef du cache est déterminée suivant le chemin de la requête (ex : /hello/Mickaël) ; il est possible de prendre en compte plus de détails comme les paramètres passés à l'URL, entre autres. Aussi, si Bottle est en mode débogage, alors le cache est ignoré.

Avec cette information, un hash est généré via la fonction small_hash(){l=python} que voici, inspirée de la version PHP smallHash() écrite pour Shaarli (idem, c'est un exemple et libre à chacun de tout chambouler) :

:pyobject: php_crc32
:language: python
:pyobject: small_hash
:language: python

Dernière étape, utiliser le décorateur :

:caption: app.py diff
:linenos:
:lineno-start: 3

 @bottle.route("/hello/<name>")
+@cache
 def index(name: str) -> str:
     return bottle.template("<b>Hello {{name}}</b>!", name=name)

Résultat

Le premier appel n'est pas en cache :

:caption: $ curl 'http://localhost:8080/hello/Mickaël'

<b>Hello Mickaël</b>

Et les suivants le sont :

:caption: $ curl 'http://localhost:8080/hello/Mickaël'

<b>Hello Mickaël</b>
<!-- Cached: 2023-10-17 07:08:41.510318+00:00 -->

📜 Historique

2024-01-27 : Déplacement de l'article depuis le blog.

2023-10-17 : Premier jet.