# HG changeset patch # User paulo # Date 1643899184 28800 # Node ID 41a6e2d99f683fa0e25f376c05df73fa51fc7972 # Parent 99e4022eae522c2929c94f8fd34fa4e328c00f8a pics3: add blob cache diff -r 99e4022eae52 -r 41a6e2d99f68 pics3/pics_flask_app.py --- a/pics3/pics_flask_app.py Thu Jan 20 01:28:46 2022 -0800 +++ b/pics3/pics_flask_app.py Thu Feb 03 06:39:44 2022 -0800 @@ -2,6 +2,7 @@ import datetime import random import os +import time import flask import google.cloud.storage @@ -31,6 +32,29 @@ PICSDIALECT = PicsDialect() +class BlobCache(object): + def __init__(self): + self._bloblist_cache = {} + self._bloblist_ttl = 60*15 # 15 minutes + self._public_url_cache = {} + + def get_list_blobs(self, prefix): + if (prefix not in self._bloblist_cache + or time.time() > (self._bloblist_cache[prefix][1] + self._bloblist_ttl)): + self._bloblist_cache[prefix] = ([i for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=prefix)], + time.time()) + return self._bloblist_cache[prefix][0] + + def cache_public_url(self, blob): + if blob.name not in self._public_url_cache: + self._public_url_cache[blob.name] = blob.public_url + + def get_public_url(self, blob_name): + return self._public_url_cache[blob_name] + +BLOBCACHE = BlobCache() + + def _parse_dt(dts): return datetime.datetime.strptime(dts, "%Y%m%d") @@ -48,10 +72,18 @@ thumb_dir = f"pics/{d}/thumbs" browse_dir = f"pics/{d}/browse" - thumb_fns = [i.name for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=thumb_dir) if i.name.endswith(exts)] + thumb_fns = [] + for i in BLOBCACHE.get_list_blobs(thumb_dir): + if i.name.endswith(exts): + thumb_fns.append(i.name) + BLOBCACHE.cache_public_url(i) thumb_fns = sorted(thumb_fns, key=_numeric_pad_basename) - browse_contents = set(i.name for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=browse_dir) if i.name.endswith(exts)) + browse_contents = set() + for i in BLOBCACHE.get_list_blobs(browse_dir): + if i.name.endswith(exts): + browse_contents.add(i.name) + BLOBCACHE.cache_public_url(i) browse_fns = [] for i in thumb_fns: i_basename = os.path.splitext(os.path.basename(i))[0] @@ -83,7 +115,7 @@ def _go_thumbnail_links_to_browse_imgs_html_body(body, d, t, b, a_args={}, img_args={}, lazyload=False): - thumb_img_url = GCS_BUCKET.get_blob(t).public_url + thumb_img_url = BLOBCACHE.get_public_url(t) browse_url = flask.url_for("browse", d=d, img=os.path.basename(b)) a = body.a(href=browse_url, **a_args) @@ -98,7 +130,7 @@ def _go_thumbnail_links_to_thumbs_html_body(body, d, t, a_args={}, img_args={}): - thumb_img_url = GCS_BUCKET.get_blob(t).public_url + thumb_img_url = BLOBCACHE.get_public_url(t) thumbs_url_args = {"from": os.path.basename(t), "_anchor": "selected"} thumbs_url = flask.url_for("thumbs", d=d, **thumbs_url_args) @@ -208,7 +240,6 @@ @app.route("/") def thumbs(d): args = flask.request.args - print(f"args = {args}") from_img = args.get("from")