以下の記事に従いdjnagoアプリにキャッシュ機能を追加しました。
Djangoで、キャッシュを使う
キャッシュ元は色々とあるみたいですが、今回はデータベースを選択しました。
python
1#settings.py 2CACHES = { 3 'default': { 4 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 5 'LOCATION': 'my_cache_table', 6 } 7}
python
1#urls.py 2from django.views.decorators.cache import cache_page 3... 4... 5urlpatterns = [ 6 path('', cache_page(60 * 15)(views.Index.as_view()), name='index'), 7 path('', cache_page(60 * 15)(views.Detail.as_view()), name='detail'), 8]
上記で一旦はキャッシュを生成する事に成功はしたのですが、各ページのナビゲーションバーに以下のような記述をしております。
html
1#nav.html 2<header> 3 <nav class="navbar"> 4 {% if request.user.is_authenticated %} 5 <a href="#">ログアウト</a> 6 {% else %} 7 <a href="#">ログイン</a> 8 {% endif %} 9 </nav> 10</header>
各テンプレートではbese.htmlからnav.htmlを読み込んであります。
html
1#index.html 2{% extends 'base.html' %} 3{% block content %} 4 5{% for post in post_list %} 6<p>{{ post.title }}</p> 7{% endfor %} 8 9{% endblock %}
html
1#detail.html 2{% extends 'base.html' %} 3{% block content %} 4 5<p>{{ post.created_at }}</p> 6<p>{{ post.title }}</p> 7<p>{{ post.text }}</p> 8 9{% endblock %}
ところがこのやり方ですと、最初のページが訪れた時点でキャッシュが生成されてしまい、ログインをしたにも関わらず、「ログアウト」の表示がされず、「ログイン」の表示がされたままになってしまいます。
そこで先ほどのurls.pyでのキャッシュの指定をやめて、以下のようにしてみました。
html
1#index.html 2{% extends 'base.html' %} 3{% load cache %} 4{% block content %} 5 6{% cache 600 index %} 7{% for post in post_list %} 8<p>{{ post.title }}</p> 9{% endfor %} 10{% endcache %} 11 12{% endblock %}
html
1#detail.html 2{% extends 'base.html' %} 3{% load cache %} 4{% block content %} 5 6{% cache 600 detail %} 7<p>{{ post.created_at }}</p> 8<p>{{ post.title }}</p> 9<p>{{ post.text }}</p> 10{% endcache %} 11 12{% endblock %}
上記のやり方ですと、「ログイン」「ログアウト」の表示は期待通りの挙動をしてくれるのですが、detail.htmlにおいて、最初にアクセスされたページの詳細画面が別の詳細画面でも表示されてしまい、使い物になりませんでした。
「ログイン」「ログアウト」の含まれるナビゲーションバーのみキャッシュに含めず、detail.htmlにおいても期待通りの挙動をさせるのに良い方法はありませんでしょうか?
よろしくお願いします。
参考までに、views.pyは以下のようにclass viewを利用しています。
python
1from django.views.generic import ListView,DetailView 2 3class Index(ListView): 4 template_name = 'index.html' 5 model = Post 6 7class Detail(DetailView): 8 template_name = 'detail.html' 9 model = Post

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。