2

::編集::

@cache_control(no_cache=True, must_revalidate=True, no_store=True)FTW !!!!!

キャッシュ制御:キャッシュなし、ストアなし、再検証する必要があります。数人のIRCちゃんに行って周りを見回すのに時間がかかりましたが、ようやく動作するようになりました。

::編集::

@login_requiredを設定しているビューがあり、ほとんどの場合安全ですが、ビューを確認してからログアウトし、ブラウザの[戻る]ボタンを押すだけで、質問されることなくコンテンツを再度表示できます。ログインします。ただし、ページを更新すると、サーバーがリダイレクトします。

私の一時停止はキャッシュの問題であり、Chromeに履歴に保存しないように指示する必要があるかもしれません。

たとえば、請求書を表示してからログアウトした場合、バック履歴でそのページを選択すると、請求書を再度表示できます。

私はこの問題をFirefoxで問題なく試しました。Firefoxはバックエンドをログに記録するように要求するので、ブラウザの問題である必要があります。

4

4 に答える 4

6

そうです、これはキャッシュの問題です。

デコレータを使用cache_controlして、ビューにキャッシュを強制しないようにすることができます[1]:

from django.views.decorators.cache import cache_control

@cache_control(no_cache=True, must_revalidate=True, no_store=True)
def func()
  #some code
  return

@login_requiredまた、すべてのページで両方を使用する必要がないように、置き換える独自のデコレータを作成する必要があります。

[1]ログアウト後にブラウザの[戻る]ボタンを無効にしますか?

于 2012-03-08T22:10:35.667 に答える
3

この動作は、非公式にページキャッシュと呼ばれるWebkitブラウザの機能が原因で発生します。これはバック/フォワードキャッシュとも呼ばれます。現在のブラウジングセッションで前のページに何が起こるかを制御します。Webkitは、前のページを「一時停止」するという点で特別なことをします。前のページが別のタブで非表示になっているようです。戻るボタンをクリックすることは、タブを前面に表示するようなものです。ページはそのままです。これは、ネットワーク要求が行われないことを意味し、したがって、サーバーロジックが変更されることはありません。

この動作は、ChromeだけでなくSafariでも見られます。ネットワークインスペクターパネルを見て、クリックしてページに戻ったときのネットワークトラフィックを監視します。一見、リクエストがあったように見えます。Safariは、実際にはリクエストが行われなかったという考えを払拭するのに役立ちません。Chromeはより丁寧で、ページが「(キャッシュから)」読み込まれたことを通知します。Chromeで、サイズの列を確認するか、リクエストをクリックして、 [ヘッダー]タブのステータスコードを確認します。もちろん、他の指標は、「リクエスト」がタイムラインでかかった時間(おそらく0ms)です。

それは振る舞いを説明します...今それを回避する方法。最善の解決策は、ログアウトページでブラウザウィンドウを閉じるように通知することです。

Django側でできることは何もないと正しく判断しました。キャッシュデコレータは役に立ちません。残念ながら、ページキャッシュがページを隠してしまうのを防ぐための標準的な答えはないようです。また、これは流動的な機能のように思われるため、解決策は、Webkitの新しいバージョンでは機能しないハックである可能性があります。または、Firefoxは異なる実装で同様の機能を作成する場合があります。

HTTPSを介してサイトにサービスを提供するcache-control: no-storecache-control: no-cache、それを実行する可能性がありますが、確かに手間がかかります。考えられるハックの1つは、unload/onunloadイベントハンドラーを設定することです。

これらの 2つのSurfin'Safariの記事で、ページキャッシュの動作とアンロードハックの提案について詳しく読んでください。

更新-@DigitalCakeは、Cache-Control:no-store何らかの効果があることを発見しました。Djangoでは、これは@cache_control(no_store=True)ビューを装飾することで実現されます。Chrome(v17.0.963.66)でno store 動作します-ページはページキャッシュに隠されておらず、戻るボタンによってネットワークリクエストが発生します。Safari(v5.1.3)では動作no storeしません。これは、Webkitブラウザー間でも、ページキャッシュの実装が異なることを示しています。また、現在の回避策は一時的なハッキングである可能性が高いという点も示しています。

于 2012-03-08T22:29:10.330 に答える
0

私はこの解決策を試しましたが、うまくいきました。

私は現金管理とログインの両方を必要としていました。

これが例です

from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_control

@cache_control(no_cache=True, must_revalidate=True, no_store=True)
@login_required(login_url='login')
def myview(request):
   return HttpResponse(render(request,'path_to_your_view.html'))
于 2019-03-23T08:51:51.973 に答える
0

2020年3月の更新:受け入れられた回答に加えて、Django3.0ドキュメントにはnever_cacheデコレータが表示されます。

Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private応答にヘッダーを追加します。

于 2020-03-01T19:11:40.933 に答える