Skip to content

Instantly share code, notes, and snippets.

@glenrobertson
Last active January 15, 2022 21:15
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save glenrobertson/954da3acec84606885f5 to your computer and use it in GitHub Desktop.
Save glenrobertson/954da3acec84606885f5 to your computer and use it in GitHub Desktop.
Flask response cache decorator
import datetime
import time
from functools import wraps
from wsgiref.handlers import format_date_time
from flask import make_response
def cache(expires=None, round_to_minute=False):
"""
Add Flask cache response headers based on expires in seconds.
If expires is None, caching will be disabled.
Otherwise, caching headers are set to expire in now + expires seconds
If round_to_minute is True, then it will always expire at the start of a minute (seconds = 0)
Example usage:
@app.route('/map')
@cache(expires=60)
def index():
return render_template('index.html')
"""
def cache_decorator(view):
@wraps(view)
def cache_func(*args, **kwargs):
now = datetime.datetime.now()
response = make_response(view(*args, **kwargs))
response.headers['Last-Modified'] = format_date_time(time.mktime(now.timetuple()))
if expires is None:
response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0'
response.headers['Expires'] = '-1'
else:
expires_time = now + datetime.timedelta(seconds=expires)
if round_to_minute:
expires_time = expires_time.replace(second=0, microsecond=0)
response.headers['Cache-Control'] = 'public'
response.headers['Expires'] = format_date_time(time.mktime(expires_time.timetuple()))
return response
return cache_func
return cache_decorator
@elibroftw
Copy link

It doesn't work, I tried importing from another file and using it in the same file. No such luck. I'm using python 3.6.2, and also using the flask_compress module

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment