質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

受付中

Djangoでキャッシュを部分的に除外するにはどうしたら良いでしょうか?

tscsettt
tscsettt

総合スコア7

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0回答

0リアクション

0クリップ

46閲覧

投稿2022/11/24 14:16

以下の記事に従いdjnagoアプリにキャッシュ機能を追加しました。
Djangoで、キャッシュを使う

キャッシュ元は色々とあるみたいですが、今回はデータベースを選択しました。

python

#settings.py CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }

python

#urls.py from django.views.decorators.cache import cache_page ... ... urlpatterns = [ path('', cache_page(60 * 15)(views.Index.as_view()), name='index'), path('', cache_page(60 * 15)(views.Detail.as_view()), name='detail'), ]

上記で一旦はキャッシュを生成する事に成功はしたのですが、各ページのナビゲーションバーに以下のような記述をしております。

html

#nav.html <header> <nav class="navbar"> {% if request.user.is_authenticated %} <a href="#">ログアウト</a> {% else %} <a href="#">ログイン</a> {% endif %} </nav> </header>

各テンプレートではbese.htmlからnav.htmlを読み込んであります。

html

#index.html {% extends 'base.html' %} {% block content %} {% for post in post_list %} <p>{{ post.title }}</p> {% endfor %} {% endblock %}

html

#detail.html {% extends 'base.html' %} {% block content %} <p>{{ post.created_at }}</p> <p>{{ post.title }}</p> <p>{{ post.text }}</p> {% endblock %}

ところがこのやり方ですと、最初のページが訪れた時点でキャッシュが生成されてしまい、ログインをしたにも関わらず、「ログアウト」の表示がされず、「ログイン」の表示がされたままになってしまいます。
そこで先ほどのurls.pyでのキャッシュの指定をやめて、以下のようにしてみました。

html

#index.html {% extends 'base.html' %} {% load cache %} {% block content %} {% cache 600 index %} {% for post in post_list %} <p>{{ post.title }}</p> {% endfor %} {% endcache %} {% endblock %}

html

#detail.html {% extends 'base.html' %} {% load cache %} {% block content %} {% cache 600 detail %} <p>{{ post.created_at }}</p> <p>{{ post.title }}</p> <p>{{ post.text }}</p> {% endcache %} {% endblock %}

上記のやり方ですと、「ログイン」「ログアウト」の表示は期待通りの挙動をしてくれるのですが、detail.htmlにおいて、最初にアクセスされたページの詳細画面が別の詳細画面でも表示されてしまい、使い物になりませんでした。

「ログイン」「ログアウト」の含まれるナビゲーションバーのみキャッシュに含めず、detail.htmlにおいても期待通りの挙動をさせるのに良い方法はありませんでしょうか?
よろしくお願いします。

参考までに、views.pyは以下のようにclass viewを利用しています。

python

from django.views.generic import ListView,DetailView class Index(ListView): template_name = 'index.html' model = Post class Detail(DetailView): template_name = 'detail.html' model = Post

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。