Python – Flask Cache URL mit Query String als cache_key

Python Micro-Framework Flask
Python Micro-Framework Flask

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.