import hashlib import os from flask import request def get_file_hash(filepath: str) -> str: with open(filepath, 'rb') as file_handle: return hashlib.md5(file_handle.read()).hexdigest()[:8] def register_asset_helpers(app): @app.context_processor def inject_static_hash(): def static_hash(filename: str) -> str: filepath = os.path.join(app.static_folder, filename) file_hash = get_file_hash(filepath) return f'/static/{filename}?v={file_hash}' return dict(static_hash=static_hash) @app.after_request def add_header(response): if request.path.startswith('/static/'): response.cache_control.no_cache = None response.cache_control.no_store = None response.cache_control.max_age = 31536000 response.cache_control.public = True response.headers.pop('Content-Disposition', None) else: response.cache_control.no_cache = True response.cache_control.no_store = True return response @app.context_processor def inject_config(): def get_base_url() -> str: scheme = request.headers.get('X-Forwarded-Proto', request.scheme) host = request.headers.get('X-Forwarded-Host', request.host) return f'{scheme}://{host}' return dict(base_url=get_base_url, request=request)