49

I tried using this

@app.after_request
def add_header(response):
    response.headers['Cache-Control'] = 'max-age=300'
    return response

But this causes a duplicate Cache-Control header to appear. I only want max-age=300, NOT the max-age=1209600 line!

$ curl -I http://my.url.here/
HTTP/1.1 200 OK
Date: Wed, 16 Apr 2014 14:24:22 GMT
Server: Apache
Cache-Control: max-age=300
Content-Length: 107993
Cache-Control: max-age=1209600
Expires: Wed, 30 Apr 2014 14:24:22 GMT
Content-Type: text/html; charset=utf-8
1
  • This might be a dirty way but you can always check if the header 'Cache-Control' exists already and delete it if does and then add your header. Something like `if 'Cache-Control' in response.headers: del response.headers['Cache-Control'] Commented Apr 16, 2014 at 16:08

3 Answers 3

82

Use the response.cache_control object; this is a ResponseCacheControl() instance letting you set various cache attributes directly. Moreover, it'll make sure not to add duplicate headers if there is one there already.

@app.after_request
def add_header(response):
    response.cache_control.max_age = 300
    return response
Sign up to request clarification or add additional context in comments.

13 Comments

Also response.cache_control.public = True.
it's still adding no-cache. flask sux
@france1: without any context, that's not something I can help with. There is no default value for the header, so if you see Cache-Control: no-cache in your responses something is setting that explicitly. Could be your Flask code, could be something else. It is not the default, however. Sorry, but you really can't blame this on Flask.
@MartijnPieters yeah I understand; I figured out that it only happens when it's in development mode. I personally think that's very annoying, but...
@france1: there is no code in Flask that would do that.
|
46

You can set the default value for all static files when you create the Flask application:

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 300

Note that if you modify request.cache_control in after_request, as in the accepted answer, this will also modify the Cache-Control header for static files and may override the behavior you set as I showed above. I'm currently using the following code to completely disable caching for dynamically generated content but not static files:

# No cacheing at all for API endpoints.
@app.after_request
def add_header(response):
    # response.cache_control.no_store = True
    if 'Cache-Control' not in response.headers:
        response.headers['Cache-Control'] = 'no-store'
    return response

Not completely sure this is the best way, but it's working for me so far.

4 Comments

Kudos for the if 'Cache-Control' not in ... bit, very smart to encourage people to check that!
@aldel What file would contain app = Flask(__name__) ?
@AlanH It has to exist somewhere in a Flask app. It would usually be one of the top-level files, i.e., the one that you run as __main__, or one that it imports.
max-age=0 can also be added to force the cache to revalidate because no-store will only prevent a new resource from being cached, but not prevent the cache from responding with a resource from a previous request response.headers["Cache-Control"] = "no-store, max-age=0"
0

I am using this in my views.py and auth.py files:

def no_cache(resp):
    resp.headers['Cache-Control'] = 'max-age=1, No-Store'

@views.route('/', METHOD=['GET'])
def home_page():
    resp = make_response(render_template("somepage.html", user=current_user), 200)
    no_cache(resp)
    return resp

1 Comment

Why the -1 ? Not fair

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.