Using Flask, how do I modify the Cache-Control header for ALL output?

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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x