A function-level caching and invalidation framework for Django