Implement assetcache module with asset hashing.
Provides a module `assetcache` to support automatic cachebusting of static web assets, rather than the current approach of incrementing a version number. On module load, it walks the file/assets/ dir, computes a CRC32 of each asset, and provides those hashes via `assetcache_get(path)` at runtime. The primary consumer of hashes at present is the new `asset` filter for Jinja2, which accepts a relative asset path and returns the full path, with cache busting, suitable for final use in the template. Ex: `{{ 'css/main.css' | asset }}`
This commit is contained in:
parent
c00533dc6e
commit
fcb51c09d3
2 changed files with 30 additions and 0 deletions
20
files/helpers/assetcache.py
Normal file
20
files/helpers/assetcache.py
Normal file
|
@ -0,0 +1,20 @@
|
|||
import os
|
||||
import zlib
|
||||
from collections import defaultdict
|
||||
|
||||
ASSET_DIR = 'files/assets'
|
||||
ASSET_CACHE = defaultdict(lambda: None)
|
||||
|
||||
def assetcache_build(asset_dir):
|
||||
for root, dirs, files in os.walk(asset_dir):
|
||||
for fname in files:
|
||||
fpath = root + '/' + fname
|
||||
relpath = fpath[len(asset_dir) + 1:].replace('\\', '/')
|
||||
with open(fpath, 'rb') as f:
|
||||
fhash = zlib.crc32(f.read())
|
||||
ASSET_CACHE[relpath] = '%x' % fhash
|
||||
|
||||
def assetcache_get(path):
|
||||
return ASSET_CACHE[path]
|
||||
|
||||
assetcache_build(ASSET_DIR)
|
Loading…
Add table
Add a link
Reference in a new issue