Mercurial > hg > index.fcgi > www > www-1
changeset 133:41a6e2d99f68
pics3: add blob cache
author | paulo |
---|---|
date | Thu, 03 Feb 2022 06:39:44 -0800 |
parents | 99e4022eae52 |
children | e3dd2ebf1299 |
files | pics3/pics_flask_app.py |
diffstat | 1 files changed, 36 insertions(+), 5 deletions(-) [+] |
line diff
1.1 --- a/pics3/pics_flask_app.py Thu Jan 20 01:28:46 2022 -0800 1.2 +++ b/pics3/pics_flask_app.py Thu Feb 03 06:39:44 2022 -0800 1.3 @@ -2,6 +2,7 @@ 1.4 import datetime 1.5 import random 1.6 import os 1.7 +import time 1.8 1.9 import flask 1.10 import google.cloud.storage 1.11 @@ -31,6 +32,29 @@ 1.12 PICSDIALECT = PicsDialect() 1.13 1.14 1.15 +class BlobCache(object): 1.16 + def __init__(self): 1.17 + self._bloblist_cache = {} 1.18 + self._bloblist_ttl = 60*15 # 15 minutes 1.19 + self._public_url_cache = {} 1.20 + 1.21 + def get_list_blobs(self, prefix): 1.22 + if (prefix not in self._bloblist_cache 1.23 + or time.time() > (self._bloblist_cache[prefix][1] + self._bloblist_ttl)): 1.24 + self._bloblist_cache[prefix] = ([i for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=prefix)], 1.25 + time.time()) 1.26 + return self._bloblist_cache[prefix][0] 1.27 + 1.28 + def cache_public_url(self, blob): 1.29 + if blob.name not in self._public_url_cache: 1.30 + self._public_url_cache[blob.name] = blob.public_url 1.31 + 1.32 + def get_public_url(self, blob_name): 1.33 + return self._public_url_cache[blob_name] 1.34 + 1.35 +BLOBCACHE = BlobCache() 1.36 + 1.37 + 1.38 def _parse_dt(dts): 1.39 return datetime.datetime.strptime(dts, "%Y%m%d") 1.40 1.41 @@ -48,10 +72,18 @@ 1.42 thumb_dir = f"pics/{d}/thumbs" 1.43 browse_dir = f"pics/{d}/browse" 1.44 1.45 - thumb_fns = [i.name for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=thumb_dir) if i.name.endswith(exts)] 1.46 + thumb_fns = [] 1.47 + for i in BLOBCACHE.get_list_blobs(thumb_dir): 1.48 + if i.name.endswith(exts): 1.49 + thumb_fns.append(i.name) 1.50 + BLOBCACHE.cache_public_url(i) 1.51 thumb_fns = sorted(thumb_fns, key=_numeric_pad_basename) 1.52 1.53 - browse_contents = set(i.name for i in GCS_CLIENT.list_blobs(GCS_BUCKET, prefix=browse_dir) if i.name.endswith(exts)) 1.54 + browse_contents = set() 1.55 + for i in BLOBCACHE.get_list_blobs(browse_dir): 1.56 + if i.name.endswith(exts): 1.57 + browse_contents.add(i.name) 1.58 + BLOBCACHE.cache_public_url(i) 1.59 browse_fns = [] 1.60 for i in thumb_fns: 1.61 i_basename = os.path.splitext(os.path.basename(i))[0] 1.62 @@ -83,7 +115,7 @@ 1.63 1.64 1.65 def _go_thumbnail_links_to_browse_imgs_html_body(body, d, t, b, a_args={}, img_args={}, lazyload=False): 1.66 - thumb_img_url = GCS_BUCKET.get_blob(t).public_url 1.67 + thumb_img_url = BLOBCACHE.get_public_url(t) 1.68 browse_url = flask.url_for("browse", d=d, img=os.path.basename(b)) 1.69 1.70 a = body.a(href=browse_url, **a_args) 1.71 @@ -98,7 +130,7 @@ 1.72 1.73 1.74 def _go_thumbnail_links_to_thumbs_html_body(body, d, t, a_args={}, img_args={}): 1.75 - thumb_img_url = GCS_BUCKET.get_blob(t).public_url 1.76 + thumb_img_url = BLOBCACHE.get_public_url(t) 1.77 thumbs_url_args = {"from": os.path.basename(t), "_anchor": "selected"} 1.78 thumbs_url = flask.url_for("thumbs", d=d, **thumbs_url_args) 1.79 1.80 @@ -208,7 +240,6 @@ 1.81 @app.route("/<d>") 1.82 def thumbs(d): 1.83 args = flask.request.args 1.84 - print(f"args = {args}") 1.85 1.86 from_img = args.get("from") 1.87