68

私が使用しているファイルの 1 つに変更を加えましたが、.js何をしても、flask はメモリ キャッシュからファイルの最後のバージョンを変更なしで取得することを主張します。

明確にするために、私は次の構造を持っています。それはすべてから始まりますfoo.html

return render_template foo.html

foo.htmlいくつかのデータでフラスコを呼び出し、2 番目のテンプレートを返すフォームが内部にありますbar.html

return render_template bar.html

この 2 番目のテンプレートは.js、フォルダーに配置されたファイルを呼び出しますstaticが、コードが変更されても更新されません。

上記の構造について言及したのは、ファイルが代わりに.js配置された場合、 Flaskファイルの新しい変更を取得するためです。しかし、Flask ではそれらを完全に無視します。foo.htmlbar.htmlbar.html

何が起こっている?

機能した唯一のことは、ブラウザで「キャッシュを無効にする」をクリックして、再度リロードすることでした。

4

5 に答える 5

103

最終的に、これはイライラするブラウザ キャッシュの問題であり、ブラウザに強制的に「ハード リフレッシュ」を実行させることで解決できます。これは、ブラウザ/OS に依存するキーストロークになりますが、通常は次のように動作します。

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

この問題を回避するために使用できる他のファイル名のトリックがあります(OPのコメントに記載されています)。これらは、ブラウザの動作を制御できない本番環境では特に重要です。

非 Static Flask 応答の場合、cache_control.max_ageプロパティを設定できます。これにより、応答がキャッシュされている場合にいつ期限切れになるかをブラウザに伝える必要があります。たとえば、JSON データを返す Flask XHR エンドポイントがある場合、次のようにすることができます。

@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

通常、特定のリソース タイプ (例: CSS/JS/HTML/JSON/etc) の本番 Web サーバー構成でデフォルト値を設定することもできます。

2019年4月1日編集(エイプリルフールとは無関係)

  • Mac / Safari のキーストロークは Cmd+Opt+R のようになりました (コメントより、ありがとう!)。
  • 更新されたファイルのキャッシュされたコピーをブラウザに強制的に無視させる非常に洗練された「ファイル名のトリック」については、@MarredCheese からの新しい回答を参照してください。
于 2016-12-14T15:43:00.893 に答える
23

Flask を使用して静的アセットを提供している場合 (これは通常、開発環境の場合です)、SEND_FILE_MAX_AGE_DEFAULT構成値を設定する必要がある場合があります。

send_static_file()(デフォルトの静的ファイル ハンドラ) およびsend_file()で使用するデフォルトのキャッシュ コントロールの最大経過datetime.timedelta時間。get_send_file_max_age()それぞれ Flask または Blueprintのフックを使用して、ファイルごとにこの値をオーバーライドします。デフォルトは 43200 (12 時間) です。

app.configこれを解決するには、次のように辞書を更新するのと同じくらい簡単です。

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

これを行うと、ブラウザは Flask によって提供される静的アセットをキャッシュしません。

于 2016-12-14T19:22:39.390 に答える