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>
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)
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 -->
2024-01-27 : Déplacement de l'article depuis le blog.
2023-10-17 : Premier jet.