Wer bei dem Python Microframework Flask die Cache-Funktion für URLs verwendet wird bemerkt haben, dass die Request-Argumente bzw. der Query String per default nicht beachtet wird und so bei verschiedenen Request-Argumenten immer die selbe Seite aus dem Cache ausgeliefert
wird.
Da dies oft nicht gewollt ist, muss eine Möglichkeit gefunden werden den Query String in den Cache_Key einzubeziehen.
Die Cache-Funktion von Flask bietet die Möglichkeit den key_prefix selbst zu definieren. Dass dies auch mit einer anderen Funktion möglich ist, wurde sehr schlau gedacht.
Wir erstellen uns dazu eine eigene Funktion make_cache_key. Dieser übergeben wir die Parameter von dem Seitenaufruf und bekommen einen gehashten Wert aus unseren request.path und den request.args.
def make_cache_key(*args, **kwargs): path = request.path args = str(hash(frozenset(request.args.items()))) return (path + args)
Nun passen wir den key_prefix der Cache-Funktion an.
@app.route('/test/',methods=['GET']) @cache.cached(timeout=60, key_prefix=make_cache_key) def test(): return request.args.get('var_test',' ')
Nun können wir die Seite mehrmals mit verschiedenen Parametern aufrufen (z.B. in der Entwicklungsumgebnung mit cURL).
curl http://127.0.0.1:5000/test/?var_test=cachetest curl http://127.0.0.1:5000/test/?var_test=testtest curl http://127.0.0.1:5000/test/?var_test=testcache curl http://127.0.0.1:5000/test/?var_test=cachecache ...
Ich nutze in meinem Fall Redis als Cache_Tye. Mit der CLI von Redis können wir nun die Einträge überprüfen.
127.0.0.1:6379> keys * 1) "/test/-1054235136629436168" 2) "/test/-4409764916899334844" 3) "/test/5207553941322404619" 4) "/test/-7323760589676507296"
Man sieht nun sehr gut, dass für jeden URL-Aufruf je nach Request-Argument ein eigener Cache-Eintrag erstellt wurde.
Weitere Informationen gibt auf der Projektseite von Flask-Cache.