import os import hashlib from functools import lru_cache from flask import current_app @lru_cache(maxsize=128) def get_file_hash(filepath): """ Get the MD5 hash of a file's contents. Uses LRU cache to avoid re-reading files that haven't changed. Args: filepath: The path to the file Returns: str: The MD5 hash of the file contents """ try: with open(filepath, 'rb') as f: return hashlib.md5(f.read()).hexdigest() except (IOError, OSError): return None def get_asset_version(filename): """ Get the version hash for a static asset. Args: filename: The filename of the static asset Returns: str: The version hash or None if file not found """ if not filename: return None # Get the absolute path to the static file static_dir = os.path.join(current_app.root_path, 'static') filepath = os.path.join(static_dir, filename) # Get the file hash file_hash = get_file_hash(filepath) # If file not found or error reading, return None if not file_hash: return None # Return first 8 characters of hash as version return file_hash[:8]