Конечно можно. Прежде всего, только вы знаете, истек ли ресурс или нет, ресурс может быть из файла, статьи из базы данных, поэтому для вас не будет метода «истек или нет» юниверса. Вот простой пример:
class WSGICache(object):
def __init__(self, app):
self.app = app
self.cache = {}
def is_expired(self, environ):
"""Determine is the resource the request for already expired?
"""
# FIXME: check is the resource expired, by looking
# PATH_INFO, if it is a file, it might be last modified time
# if it is an object from database, see what is the last modified time
return False
def __call__(self, environ, start_response):
path = environ['PATH_INFO']
cached = self.cache.get(path)
# do we have valid cache?
if self.is_expired(environ) or not cached:
cached = list(self.app(environ, start_response))
self.cache[path] = cached
return cached
Но для производственного использования я предлагаю использовать уже встроенную систему кэширования, такую как Beaker , я думаю, что она должна быть достаточно хороша, чтобы делать то, что вы хотите.
Я не тестировал приведенный выше код, но промежуточное ПО, подобное этому, сможет делать то, что вы хотите.