Question: I made a change on one of the `.js` files that I use and no matter what I do, flask insists on picking up, from memory cache, the last version of the file, without the change.

To clarify, I have the following structure. It all starts with `foo.html`

```
return render_template foo.html

```

`foo.html` has a form inside that calls flask with some data and then returns a second template `bar.html`:

```
return render_template bar.html

```

This second template calls some `.js` file, placed in the `static` folder, but it doesn't update when the code changes.

I mention the structure above because if the `.js` file was placed on `foo.html` instead of `bar.html` then Flask **would** pick up the new changes on the file. But in `bar.html` Flask completely ignores them.

What is happening? 

The only thing that worked was to click on "disable cache" on the browser and reload again.

Answer: 
Ultimately this is a frustrating browser cache issue, which can be solved by forcing the browser to do a "hard refresh", which is going to be a browser/OS dependent keystroke, but generally this works:

* Windows: Ctrl+F5
* Mac: Cmd+Shift+R
* Linux: Ctrl+Shift+R

There are other filename tricks one can use to avoid this issue (mentioned in comments of the OP). These are especially important in production where you have no control over browser behavior.

For non-Static Flask responses you can set the `cache_control.max_age` property, which should tell the browser when to expire the response if it is cached. For instance if you have a Flask XHR endpoint that returns JSON data you could do this:

```
@app.route('/_get_ajax_data/')
def get_ajax_data():
    data = {"hello": "world"}
    response = jsonify(data)
    response.cache_control.max_age = 60 * 60 * 24  # 1 day (in seconds)
    return response

```

You typically can also set default values in your production web server configuration for specific resource types (e.g. CSS/JS/HTML/JSON/etc)

**Edit 4/1/2019** (unrelated to April Fools day)

* Mac / Safari keystroke now appears to be: Cmd+Opt+R (via comments, thanks!).
* See the new answer from @MarredCheese for a very elegant "filename trick" to force the browser to ignore cached copies for updated files.
If you are serving your static assets with Flask (this is typically the case in a development environment), then you might need to set the [`SEND_FILE_MAX_AGE_DEFAULT` configuration value](https://flask.palletsprojects.com/en/1.1.x/config/#SEND_FILE_MAX_AGE_DEFAULT):

> 
> Default cache control max age to use with `send_static_file()` (the default static file handler) and `send_file()`, as `datetime.timedelta` or as seconds. Override this value on a per-file basis using the `get_send_file_max_age()` hook on Flask or Blueprint, respectively. Defaults to 43200 (12 hours).
> 
> 
> 

Solving this can be as simple as updating the `app.config` dictionary, like so:

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

```

If you do that, your browser will not cache static assets that are served by Flask.