{"title":"セッションの使いかた","version":"4.2","locale":"ja","docname":"topics/http/sessions","url":"/ja/4.2/topics/http/sessions/","canonical":"https://djangodocs.dev/ja/4.2/topics/http/sessions/","summary":"Django は、匿名のセッションをフルサポートしています。このセッションフレームワークを使えば、任意のデータを、サイトの訪問者ごとに保存し、取得することができます。データはサーバー側に保存され、クッキーの送受信によって抽象化します。クッキーには、データそのものではなくセッション ID が書かれています (…","html":"<span id=\"how-to-use-sessions\"></span><h1>セッションの使いかた<a class=\"heading-anchor\" href=\"#module-django.contrib.sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django は、匿名のセッションをフルサポートしています。このセッションフレームワークを使えば、任意のデータを、サイトの訪問者ごとに保存し、取得することができます。データはサーバー側に保存され、クッキーの送受信によって抽象化します。クッキーには、データそのものではなくセッション ID が書かれています ( <a class=\"reference internal\" href=\"#cookie-session-backend\"><span class=\"std std-ref\">クッキーベースのバックエンド</span></a> を使用しない限り)。</p>\n<section id=\"enabling-sessions\">\n<h2>セッションを有効にする<a class=\"heading-anchor\" href=\"#enabling-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>セッションは、 <a class=\"reference internal\" href=\"/ja/4.2/ref/middleware/\"><span class=\"doc\">ミドルウェア</span></a> の1つを使って実装されています。</p>\n<p>セッションの機能を有効にするには、次のように設定を行います。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 設定を編集し <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sessions.middleware.SessionMiddleware'</span></code> を含むようにする。 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code> で作られるデフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> が有効化されています。</p></li>\n</ul>\n<p>セッションを使いたくない場合は、 <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 内の <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 行と <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 内の <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sessions'</span></code> を削除しても構いません。これで、オーバーヘッドが少しだけ短縮されます。</p>\n</section>\n<section id=\"configuring-the-session-engine\">\n<span id=\"configuring-sessions\"></span><h2>セッションエンジンを設定する<a class=\"heading-anchor\" href=\"#configuring-the-session-engine\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>デフォルトでは、Django はセッションを、(<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.models.Session</span></code> モデルを用いて) データベースに保存します。これは便利ですが、セットアップによってはセッションのデータを他の場所においたほうが高速化できる場合があります。そのため、Django はセッションデータをファイルシステムやキャッシュに保存するように設定することができます。</p>\n<section id=\"using-database-backed-sessions\">\n<h3>データベースを使ったセッション<a class=\"heading-anchor\" href=\"#using-database-backed-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>データベースを使った (database-backed) セッションを使いたい場合には、設定ファイルの <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>  に <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sessions'</span></code> を追加する必要があります。</p>\n<p>一度インストールの設定をすれば、<code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> を実行することで、セッションデータを保存する1つのデータベーステーブルをインストールできます。</p>\n</section>\n<section id=\"using-cached-sessions\">\n<span id=\"cached-sessions-backend\"></span><h3>キャッシュを使ったセッション<a class=\"heading-anchor\" href=\"#using-cached-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>よいパフォーマンスを発揮するには、キャッシュを使ったセッションバックエンドを利用した方が良いかもしれません。</p>\n<p>Django のキャッシュシステムを使ってセッションデータを保存するには、まず初めに、キャッシュの設定を済ませておく必要があります。詳しくは、 <a class=\"reference internal\" href=\"/ja/4.2/topics/cache/\"><span class=\"doc\">キャッシュのドキュメンテーション</span></a> を読んでください。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>キャッシュを使ったセッションを用いるのは、Memcached または Redis キャッシュバックエンドを使用している場合だけにするべきです。ローカルなメモリキャッシュバックエンドを使用している場合、長時間データをメモリ上に保持しておくのは良い考えではありませんし、全てのデータをファイルやデータベースキャッシュバックエンドを通して送信するよりも、ファイルやデータベースに保存されたセッションから直接送信した方が高速だからです。加えて、ローカルなメモリキャッシュバックエンドは、マルチプロセスに対して安全「ではありません」。したがって、実環境ではあまり良い選択とは言えないでしょう。</p>\n</aside>\n<p>設定ファイルの <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> で複数のキャッシュを定義している場合、Django はデフォルトのキャッシュを使用します。他のキャッシュを使用するには、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_CACHE_ALIAS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_CACHE_ALIAS</span></code></a> を使用したいキャッシュの名前に変更します。</p>\n<p>一度キャッシュが設定されると、データベース ベースのキャッシュ(database-backed cache) か非永続キャッシュ (non-persistent cache) のどちらかを選択する必要があります。</p>\n<p>The cached database backend (<code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code>) uses a write-through cache --\nsession writes are applied to both the cache and the database. Session reads\nuse the cache, or the database if the data has been evicted from the cache. To\nuse this backend, set <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a> to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.contrib.sessions.backends.cached_db&quot;</span></code>, and follow the configuration\ninstructions for the <a class=\"reference internal\" href=\"#using-database-backed-sessions\">using database-backed sessions</a>.</p>\n<p>The cache backend (<code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>) stores session data only in your cache. This is\nfaster because it avoids database persistence, but you will have to consider\nwhat happens when cache data is evicted. Eviction can occur if the cache fills\nup or the cache server is restarted, and it will mean session data is lost,\nincluding logging out users. To use this backend, set <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a>\nto <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.contrib.sessions.backends.cache&quot;</span></code>.</p>\n<p>The cache backend can be made persistent by using a persistent cache, such as\nRedis with appropriate configuration. But unless your cache is definitely\nconfigured for sufficient persistence, opt for the cached database backend.\nThis avoids edge cases caused by unreliable data storage in production.</p>\n</section>\n<section id=\"using-file-based-sessions\">\n<h3>ファイルを使ったセッション<a class=\"heading-anchor\" href=\"#using-file-based-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ファイルを使ったセッションを使用するには、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.contrib.sessions.backends.file&quot;</span></code> に設定します。</p>\n<p>Django がセッションファイルを保存する場所を設定したい場合には、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_FILE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_FILE_PATH</span></code></a> を設定します (出力先のデフォルト値は、<code class=\"docutils literal notranslate\"><span class=\"pre\">tempfile.gettempdir()</span></code>、普通は <code class=\"docutils literal notranslate\"><span class=\"pre\">/tmp</span></code> になっています)。ウェブサーバが設定した場所の読み書きの権限を持っていることを確認しておいてください。</p>\n</section>\n<section id=\"using-cookie-based-sessions\">\n<span id=\"cookie-session-backend\"></span><h3>クッキーを使ったセッション<a class=\"heading-anchor\" href=\"#using-cookie-based-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>クッキーを使ったセッションを使用するには、 <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.contrib.sessions.backends.signed_cookies&quot;</span></code> に設定します。セッションデータは、 <a class=\"reference internal\" href=\"/ja/4.2/topics/signing/\"><span class=\"doc\">暗号化署名</span></a> のための Django のツールと <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> を使って保存されます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>保存されたデータに JavaScript からアクセスできないように、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_HTTPONLY</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定しておくことをおすすめします。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code> <strong>または</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code> <strong>が知られてしまい、</strong> <a class=\"reference internal\" href=\"#django.contrib.sessions.serializers.PickleSerializer\" title=\"django.contrib.sessions.serializers.PickleSerializer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PickleSerializer</span></code></a> <strong>を使用していた場合、任意のリモートコードが実行可能になってしまいます。</strong></p>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> または <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a> を知っている攻撃者は、偽造したセッションデータを生成して Django のサイトを騙すことができるのみならず、pickle を使ってシリアライズしたデータを送ることで、リモートから任意のコードを実行できてしまいます。</p>\n<p>クッキーを使ったセッションを使うときには、リモートからアクセスできるいかなるシステムに対しても秘密鍵が絶対に外に漏れないように、細心の注意を払ってください。</p>\n<p><strong>このセッションデータは、署名はされていますが、暗号化はされていません。</strong></p>\n<p>クッキーバックエンドを使う時には、セッションデータはクライアントが自由に読むことができます。</p>\n<p>MAC (Message Authentication Code; メッセージ認証コード) を使っているので、たとえクライアントがデータを勝手に書き変えてしまったとしても、書き換えられたセッションデータは無効と判定されます。しかし、たとえばミューザのブラウザが保存しているクッキーを保存できたとしても、セッションクッキーのデータがすべて保存できず、データの一部が失われることがあり、この場合にもセッションデータは無効となってしまいます。Django はデータを圧縮しますが、それでもデータのサイズが1クッキーごとの  一般的な制限の 4096 バイト &lt;2965#section-5.3&gt; を超えてしまうことは十分に考えられることです。</p>\n<p><strong>情報が最新であることが保証されません</strong></p>\n<p>MAC のおかげで、データの認証性 (データが他のサイトではなく、確実に自分のサイトで作られたものであること) と、完全性 (データが存在し、データが正しいこと) は保証されますが、そのデータが最新のものであることは保証することができません。つまり、クライアントからデータを受け取ったとしても、そのデータがユーザに最後に送った最新のデータであることは保証できないのです。ということは、セッションデータの使い方によっては、クッキーバックエンドでは  <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Replay_attack\">replay attacks</a> ができてしまうことになります。他のセッションバックエンドでは、サーバー側に各セッションの記録が残るので、ユーザがログアウトした時にそれを無効化できますが、クッキーを使ったセッションの場合には、ユーザがログアウトしてもセッションは無効化されません。したがって、攻撃者がユーザのクッキーを盗めば、たとえユーザがログアウトしていたとしても、そのクッキーを使ってユーザになりすますことができてしまいます。クッキーが「古くなった」と判断できるのは、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a> を過ぎた場合だけだからです。</p>\n<p><strong>パフォーマンス</strong></p>\n<p>最後に、クッキーのサイズが大きくなると、サイトの速度にも大きな影響があります。</p>\n</aside>\n</section>\n</section>\n<section id=\"using-sessions-in-views\">\n<h2>ビューでセッションを使う<a class=\"heading-anchor\" href=\"#using-sessions-in-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> を有効にすれば、それぞれの <a class=\"reference internal\" href=\"/ja/4.2/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> オブジェクト――Django のビュー関数に渡される最初の引数――は、ディクショナリライクなオブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">session</span></code> 属性を持つようになります。</p>\n<p>この <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> には、ビューの好きな場所で、何度でも、読み書きを行うことができます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">backends.base.</span></span><span class=\"sig-name descname\"><span class=\"pre\">SessionBase</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>このオブジェクトは、すべてのセッションオブジェクトのベースクラスとなっているので、以下に挙げるような基本的なディクショナリのメソッドを持っています。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.__getitem__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__getitem__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.__getitem__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">fav_color</span> <span class=\"pre\">=</span> <span class=\"pre\">request.session['fav_color']</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.__setitem__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__setitem__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.__setitem__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session['fav_color']</span> <span class=\"pre\">=</span> <span class=\"pre\">'blue'</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.__delitem__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__delitem__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.__delitem__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">del</span> <span class=\"pre\">request.session['fav_color']</span></code> 与えられた <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> がセッション内にない場合には、<code class=\"docutils literal notranslate\"><span class=\"pre\">KeyError</span></code> 例外を起こします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.__contains__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__contains__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.__contains__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">'fav_color'</span> <span class=\"pre\">in</span> <span class=\"pre\">request.session</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.get\">\n<span class=\"sig-name descname\"><span class=\"pre\">get</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.get\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">fav_color</span> <span class=\"pre\">=</span> <span class=\"pre\">request.session.get('fav_color',</span> <span class=\"pre\">'red')</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.pop\">\n<span class=\"sig-name descname\"><span class=\"pre\">pop</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">__not_given</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.pop\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>例: <code class=\"docutils literal notranslate\"><span class=\"pre\">fav_color</span> <span class=\"pre\">=</span> <span class=\"pre\">request.session.pop('fav_color',</span> <span class=\"pre\">'blue')</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.keys\">\n<span class=\"sig-name descname\"><span class=\"pre\">keys</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.keys\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.items\">\n<span class=\"sig-name descname\"><span class=\"pre\">items</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.items\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.setdefault\">\n<span class=\"sig-name descname\"><span class=\"pre\">setdefault</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.setdefault\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.clear\">\n<span class=\"sig-name descname\"><span class=\"pre\">clear</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.clear\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>また、次のようなメソッドも利用できます。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.flush\">\n<span class=\"sig-name descname\"><span class=\"pre\">flush</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.flush\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>セッションから現在のセッションデータを削除し、セッションクッキーを削除します。このメソッドは、前回のセッションデータがユーザのブラウザから再びアクセスされないようにするためなどに使います (たとえば、<a class=\"reference internal\" href=\"/ja/4.2/topics/auth/default/#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.logout()</span></code></a> がこの関数を呼びます)。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.set_test_cookie\">\n<span class=\"sig-name descname\"><span class=\"pre\">set_test_cookie</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.set_test_cookie\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザのブラウザがクッキーをサポートしているかどうか判定するために、テスト用のクッキーをセットします。クッキーの動作原理により、ユーザが次のページへのリクエストを行わないとこのテストは行えません。詳しい情報については、下の <a class=\"reference internal\" href=\"#setting-test-cookies\">Setting test cookies</a> を読んでください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.test_cookie_worked\">\n<span class=\"sig-name descname\"><span class=\"pre\">test_cookie_worked</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.test_cookie_worked\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザのブラウザがテストクッキーを正しく保存したかどうかに応じて、<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返します。クッキーの動作原理により、あらかじめ別のページのリクエストとして <code class=\"docutils literal notranslate\"><span class=\"pre\">set_test_cookie()</span></code> を呼び出しておく必要があります。詳しい情報については、下の <a class=\"reference internal\" href=\"#setting-test-cookies\">Setting test cookies</a> を読んでください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.delete_test_cookie\">\n<span class=\"sig-name descname\"><span class=\"pre\">delete_test_cookie</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.delete_test_cookie\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テストクッキーを削除します。クッキーをきれいにしておくために使ってください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.get_session_cookie_age\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_session_cookie_age</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.get_session_cookie_age\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a> の設定値を返す。これはカスタム セッション バックエンドで上書きできる。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.set_expiry\">\n<span class=\"sig-name descname\"><span class=\"pre\">set_expiry</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.set_expiry\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>セッションの有効期限を設定します。以下に挙げるようなさまざまな値を与えることができます。</p>\n<ul class=\"simple\">\n<li><p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> が整数なら、与えられた秒数だけ活動がなかった時にセッションを破棄します。たとえば、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.session.set_expiry(300)</span></code> と呼び出せば、5分後にセッションを破棄するように設定できます。</p></li>\n<li><p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> is a <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">timedelta</span></code> object, the session\nwill expire at that specific date/time.</p></li>\n<li><p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>, the user's session cookie will expire\nwhen the user's web browser is closed.</p></li>\n<li><p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> ならば、セッションはグローバルなセッション有効期限ポリシーにしたがって扱われます。</p></li>\n</ul>\n<p>セッションの読み込みを行っても、有効期限は延長されません。セッションの有効期限は、セッションが最後に*修正された*時点を基に計算されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.get_expiry_age\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_expiry_age</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.get_expiry_age\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>このセッションの有効期限までの残りの秒数を返します。カスタムの有効期限を持たない (または、ブラウザを閉じた時とセットした) セッションの場合、この値は <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a> と等しいです。</p>\n<p>この関数は 2 つの省略可能なキーワード引数を取ることができます。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">modification</span></code>: セッションを最後に修正した時刻を <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> オブジェクトとして与える。デフォルトは現在の時刻。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">expiry</span></code>: セッションの有効期限の情報を <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> オブジェクト、<a class=\"reference external\" href=\"https://docs.python.org/3/library/functions.html#int\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">int</span></code></a> (秒数で)、または <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> として与えます。デフォルトの値は、もしあれば、セッションに保存されている <a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.set_expiry\" title=\"django.contrib.sessions.backends.base.SessionBase.set_expiry\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_expiry()</span></code></a> で得られる値、なければ <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> です。</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>This method is used by session backends to determine the session expiry\nage in seconds when saving the session. It is not really intended for\nusage outside of that context.</p>\n<p>In particular, while it is <strong>possible</strong> to determine the remaining\nlifetime of a session <strong>just when</strong> you have the correct\n<code class=\"docutils literal notranslate\"><span class=\"pre\">modification</span></code> value <strong>and</strong> the <code class=\"docutils literal notranslate\"><span class=\"pre\">expiry</span></code> is set as a <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>\nobject, where you do have the <code class=\"docutils literal notranslate\"><span class=\"pre\">modification</span></code> value, it is more\nstraight-forward to calculate the expiry by-hand:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">expires_at</span> <span class=\"o\">=</span> <span class=\"n\">modification</span> <span class=\"o\">+</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">seconds</span><span class=\"o\">=</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SESSION_COOKIE_AGE</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.get_expiry_date\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_expiry_date</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.get_expiry_date\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>このセッションが破棄される日付を返します。カスタムの有効期限を持たない (または、ブラウザを閉じた時とセットした) セッションに対しては、現在時刻から <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a> の秒数までの日付に等しいです。</p>\n<p>This function accepts the same keyword arguments as\n<a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.get_expiry_age\" title=\"django.contrib.sessions.backends.base.SessionBase.get_expiry_age\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_expiry_age()</span></code></a>, and similar notes on usage apply.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.get_expire_at_browser_close\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_expire_at_browser_close</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.get_expire_at_browser_close\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns either <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, depending on whether the user's\nsession cookie will expire when the user's web browser is closed.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.clear_expired\">\n<span class=\"sig-name descname\"><span class=\"pre\">clear_expired</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.clear_expired\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>保存されているセッションから、有効期限が切れているものを削除します。このクラスメソッドは、<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-clearsessions\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">clearsessions</span></code></a> から呼び出されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.base.SessionBase.cycle_key\">\n<span class=\"sig-name descname\"><span class=\"pre\">cycle_key</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.base.SessionBase.cycle_key\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>現在のセッションデータを保持したまま、新しいセッションキーを作成します。<a class=\"reference internal\" href=\"/ja/4.2/topics/auth/default/#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.login()</span></code></a> は、このメソッドを呼び出すことで、過去のセッションを継続できるようにしています。</p>\n</dd></dl>\n\n</dd></dl>\n\n<section id=\"session-serialization\">\n<span id=\"id1\"></span><h3>セッションのシリアライズ<a class=\"heading-anchor\" href=\"#session-serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、Django はセッションデータを JSON を用いてシリアライズします。設定ファイルの <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_SERIALIZER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_SERIALIZER</span></code></a> に設定すれば、セッションをシリアライズするフォーマットをカスカムできます。 <a class=\"reference internal\" href=\"#custom-serializers\"><span class=\"std std-ref\">自作のシリアライザを書く</span></a> に書いた注意書きの通り、JSON によるシリアライズを強く推奨します。 <em>クッキーバックエンドを利用している場合は特に</em> です。</p>\n<p>For example, here's an attack scenario if you use <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a> to serialize\nsession data. If you're using the <a class=\"reference internal\" href=\"#cookie-session-backend\"><span class=\"std std-ref\">signed cookie session backend</span></a> and <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> (or any key of\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a>) is known by an attacker (there isn't an\ninherent vulnerability in Django that would cause it to leak), the attacker\ncould insert a string into their session which, when unpickled, executes\narbitrary code on the server. The technique for doing so is simple and easily\navailable on the internet. Although the cookie session storage signs the\ncookie-stored data to prevent tampering, a <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> leak\nimmediately escalates to a remote code execution vulnerability.</p>\n<section id=\"bundled-serializers\">\n<h4>バンドルされているシリアライザ<a class=\"heading-anchor\" href=\"#bundled-serializers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.serializers.JSONSerializer\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">serializers.</span></span><span class=\"sig-name descname\"><span class=\"pre\">JSONSerializer</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.serializers.JSONSerializer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/4.2/topics/signing/#module-django.core.signing\" title=\"django.core.signing: Django's signing framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.core.signing</span></code></a> の JSON シリアライザのラッパーです。基本的なデータ型だけがシリアライズ可能です。</p>\n<p>In addition, as JSON supports only string keys, note that using non-string\nkeys in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> won't work as expected:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># initial assignment</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;bar&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># subsequent requests following serialization &amp; deserialization</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># of session data</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>  <span class=\"c1\"># KeyError</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;0&quot;</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;bar&#39;</span>\n</code></pre></div>\n<p>Similarly, data that can't be encoded in JSON, such as non-UTF8 bytes like\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'\\xd9'</span></code> (which raises <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#UnicodeDecodeError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">UnicodeDecodeError</span></code></a>), can't be stored.</p>\n<p>JSON によるシリアライズの制限について詳しくは、<a class=\"reference internal\" href=\"#custom-serializers\"><span class=\"std std-ref\">自作のシリアライザを書く</span></a> セクションを読んでください。</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.serializers.PickleSerializer\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">serializers.</span></span><span class=\"sig-name descname\"><span class=\"pre\">PickleSerializer</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.serializers.PickleSerializer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Supports arbitrary Python objects, but, as described above, can lead to a\nremote code execution vulnerability if <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> or any key of\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a> becomes known by an attacker.</p>\n<aside class=\"version-note version-deprecated\" data-version=\"4.1\">\n<p class=\"version-note-title\">Deprecated since Django 4.1</p><p><span class=\"versionmodified deprecated\">バージョン 4.1 で非推奨: </span>Due to the risk of remote code execution, this serializer is deprecated\nand will be removed in Django 5.0.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"write-your-own-serializer\">\n<span id=\"custom-serializers\"></span><h4>自作のシリアライザを書く<a class=\"heading-anchor\" href=\"#write-your-own-serializer\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Note that the <a class=\"reference internal\" href=\"#django.contrib.sessions.serializers.JSONSerializer\" title=\"django.contrib.sessions.serializers.JSONSerializer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONSerializer</span></code></a>\ncannot handle arbitrary Python data types. As is often the case, there is a\ntrade-off between convenience and security. If you wish to store more advanced\ndata types including <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">Decimal</span></code> in JSON backed sessions, you\nwill need to write a custom serializer (or convert such values to a JSON\nserializable object before storing them in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code>). While\nserializing these values is often straightforward\n(<a class=\"reference internal\" href=\"/ja/4.2/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder\" title=\"django.core.serializers.json.DjangoJSONEncoder\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DjangoJSONEncoder</span></code></a> may be helpful),\nwriting a decoder that can reliably get back the same thing that you put in is\nmore fragile. For example, you run the risk of returning a <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> that\nwas actually a string that just happened to be in the same format chosen for\n<code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>s).</p>\n<p>シリアライザのクラスは、必ず次の2つのメソッドを実装しなければなりません。セッションデータのディクショナリをシリアライズする <code class=\"docutils literal notranslate\"><span class=\"pre\">dumps(self,</span> <span class=\"pre\">obj)</span></code> と、それをデシリアライズする <code class=\"docutils literal notranslate\"><span class=\"pre\">loads(self,</span> <span class=\"pre\">data)</span></code> の2つです。</p>\n</section>\n</section>\n<section id=\"session-object-guidelines\">\n<h3>セッションオブジェクトのガイドライン<a class=\"heading-anchor\" href=\"#session-object-guidelines\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Python の普通の文字列を、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> におけるディクショナリのキーとして使うこと。これは慣習のためというよりも、確実で高速にするためのルールです。</p></li>\n<li><p>セッションのディクショナリのキーで、アンダースコアで始まるキーは、Django が内部で使用するために予約されているものと考えること。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> を新しいオブジェクトで上書きせず、その属性にアクセスしたり、値をセットしたりしないこと。Python のディクショナリのように扱うこと。</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h3>例<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>次の簡単なビューは、ユーザがコメントを投稿した後で、<code class=\"docutils literal notranslate\"><span class=\"pre\">has_commented</span></code> 変数を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定します。こうすることで、同じユーザが2回以上コメントできないようにすることができます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">post_comment</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">new_comment</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;has_commented&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;ve already commented.&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">comments</span><span class=\"o\">.</span><span class=\"n\">Comment</span><span class=\"p\">(</span><span class=\"n\">comment</span><span class=\"o\">=</span><span class=\"n\">new_comment</span><span class=\"p\">)</span>\n    <span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n    <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;has_commented&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Thanks for your comment!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>次の次の簡単なビューでは、サイトの「メンバー (member)」にログインする手続きを行います。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">login</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">Member</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s2\">&quot;username&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">if</span> <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">check_password</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s2\">&quot;password&quot;</span><span class=\"p\">]):</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;member_id&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">id</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re logged in.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Your username and password didn&#39;t match.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>そして、次の例では、上の <code class=\"docutils literal notranslate\"><span class=\"pre\">login()</span></code> に対応するメンバーのログアウト処理を行います。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">logout</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">del</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;member_id&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">except</span> <span class=\"ne\">KeyError</span><span class=\"p\">:</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re logged out.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ふつう実際に使われる <a class=\"reference internal\" href=\"/ja/4.2/topics/auth/default/#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.logout()</span></code></a> 関数では、データの意図しない漏洩を防ぐために、この例より少し複雑な処理、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> の <a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.flush\" title=\"django.contrib.sessions.backends.base.SessionBase.flush\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">flush()</span></code></a> メソッドを呼び出すなどの処理を行っています。ここで挙げた例は、単にセッションオブジェクトの振る舞いをデモンストレーションすることが目的なので、完全ではない <code class=\"docutils literal notranslate\"><span class=\"pre\">logout()</span></code> を実装しました。</p>\n</section>\n</section>\n<section id=\"setting-test-cookies\">\n<h2>テストクッキーを設定する<a class=\"heading-anchor\" href=\"#setting-test-cookies\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>As a convenience, Django provides a way to test whether the user's browser\naccepts cookies. Call the <a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.set_test_cookie\" title=\"django.contrib.sessions.backends.base.SessionBase.set_test_cookie\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_test_cookie()</span></code></a>\nmethod of <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> in a view, and call\n<a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.test_cookie_worked\" title=\"django.contrib.sessions.backends.base.SessionBase.test_cookie_worked\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">test_cookie_worked()</span></code></a> in a subsequent view --\nnot in the same view call.</p>\n<p>このように <code class=\"docutils literal notranslate\"><span class=\"pre\">set_test_cookie()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">test_cookie_worked()</span></code> を分離しなければならないのはちょっと気持ち悪いですが、クッキーの動作原理により、こうするより仕方がないのです。一度ブラウザにクッキーを設定しても、そのクッキーがブラウザに保存されたかどうかを確認するには、ブラウザがもう一度リクエストを行わなければならないからです。</p>\n<p>テストクッキーがちゃんと機能していることを確認できたら、<a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.delete_test_cookie\" title=\"django.contrib.sessions.backends.base.SessionBase.delete_test_cookie\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete_test_cookie()</span></code></a> を使ってセッションをきれいにしておくことにしましょう。</p>\n<p>以下に、テストクッキーの典型的な使用例を挙げます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">login</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">test_cookie_worked</span><span class=\"p\">():</span>\n            <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">delete_test_cookie</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re logged in.&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Please enable cookies and try again.&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">set_test_cookie</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;foo/login_form.html&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"using-sessions-out-of-views\">\n<h2>ビューの外でセッションを使う<a class=\"heading-anchor\" href=\"#using-sessions-out-of-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>このセクションの例では、<code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> オブジェクトを直接 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.backends.db</span></code> バックエンドからインポートしています。しかし、実際に自分でコートを書く場合には、以下のようにして、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a> が指すセッションエンジンから <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> をインポートすることを考えるべきです。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">importlib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">import_module</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SessionStore</span> <span class=\"o\">=</span> <span class=\"n\">import_module</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SESSION_ENGINE</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">SessionStore</span>\n</code></pre></div>\n</aside>\n<p>An API is available to manipulate session data outside of a view:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sessions.backends.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SessionStore</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"n\">SessionStore</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># stored as seconds since epoch since datetimes are not serializable in JSON.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"s2\">&quot;last_login&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">1376587691</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">session_key</span>\n<span class=\"go\">&#39;2b1189a188b44ad18c35e113ac6ceead&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"n\">SessionStore</span><span class=\"p\">(</span><span class=\"n\">session_key</span><span class=\"o\">=</span><span class=\"s2\">&quot;2b1189a188b44ad18c35e113ac6ceead&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"s2\">&quot;last_login&quot;</span><span class=\"p\">]</span>\n<span class=\"go\">1376587691</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore.create()</span></code> is designed to create a new session (i.e. one not\nloaded from the session store and with <code class=\"docutils literal notranslate\"><span class=\"pre\">session_key=None</span></code>). <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> is\ndesigned to save an existing session (i.e. one loaded from the session store).\nCalling <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> on a new session may also work but has a small chance of\ngenerating a <code class=\"docutils literal notranslate\"><span class=\"pre\">session_key</span></code> that collides with an existing one. <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code>\ncalls <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> and loops until an unused <code class=\"docutils literal notranslate\"><span class=\"pre\">session_key</span></code> is generated.</p>\n<p>If you're using the <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.backends.db</span></code> backend, each\nsession is a normal Django model. The <code class=\"docutils literal notranslate\"><span class=\"pre\">Session</span></code> model is defined in\n<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.2.x/django/contrib/sessions/models.py\">django/contrib/sessions/models.py</a>. Because it's a normal model, you can\naccess sessions using the normal Django database API:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sessions.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Session</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"n\">Session</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"s2\">&quot;2b1189a188b44ad18c35e113ac6ceead&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">expire_date</span>\n<span class=\"go\">datetime.datetime(2005, 8, 20, 13, 35, 12)</span>\n</code></pre></div>\n<p>Note that you'll need to call\n<a class=\"reference internal\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.get_decoded\" title=\"django.contrib.sessions.base_session.AbstractBaseSession.get_decoded\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_decoded()</span></code></a> to get the session\ndictionary. This is necessary because the dictionary is stored in an encoded\nformat:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">session_data</span>\n<span class=\"go\">&#39;KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">get_decoded</span><span class=\"p\">()</span>\n<span class=\"go\">{&#39;user_id&#39;: 42}</span>\n</code></pre></div>\n</section>\n<section id=\"when-sessions-are-saved\">\n<h2>セッションが保存されるタイミング<a class=\"heading-anchor\" href=\"#when-sessions-are-saved\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>デフォルトでは、Django がセッションデータベースへデータを保存するのは、セッションが修正された時だけ、つまり、ディクショナリ直下の値が代入または削除された時だけです。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Session is modified.</span>\n<span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;bar&quot;</span>\n\n<span class=\"c1\"># Session is modified.</span>\n<span class=\"k\">del</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">]</span>\n\n<span class=\"c1\"># Session is modified.</span>\n<span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n\n<span class=\"c1\"># Gotcha: Session is NOT modified, because this alters</span>\n<span class=\"c1\"># request.session[&#39;foo&#39;] instead of request.session.</span>\n<span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;baz&quot;</span>\n</code></pre></div>\n<p>上の例の場合、セッションオブジェクトに修正したことを明示的に伝えるためには、<code class=\"docutils literal notranslate\"><span class=\"pre\">modified</span></code> 属性を設定すれば良いです。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">modified</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>このデフォルトの動作を変更するには、設定ファイルの <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_SAVE_EVERY_REQUEST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_SAVE_EVERY_REQUEST</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定します。<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定すると、Django は1リクエストごとに、セッションをデータベースに保存してくれるようになります。</p>\n<p>セッションクッキーが送信されるのは、セッションの作成及び修正時のみであることに注意してください。<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_SAVE_EVERY_REQUEST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_SAVE_EVERY_REQUEST</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定すると、各リクエストごとにセッションクッキーが送信されるようになります。</p>\n<p>同時に、セッションクッキーの <code class=\"docutils literal notranslate\"><span class=\"pre\">expires</span></code> 部分も、セッションクッキーが送信されるごとに更新されます。</p>\n<p>レスポンスステータスコードが 500 の時には、セッションは保存されません。</p>\n</section>\n<section id=\"browser-length-sessions-vs-persistent-sessions\">\n<span id=\"browser-length-vs-persistent-sessions\"></span><h2>ブラウザ起動中のみ有効なセッション vs. 永続的なセッション<a class=\"heading-anchor\" href=\"#browser-length-sessions-vs-persistent-sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a> 設定を使うと、セッションフレームワークが、ブラウザ起動中のみ有効なセッションと永続的なセッションのどちらを使うか設定できます。</p>\n<p>デフォルトでは、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> にセットされていて、セッションクッキーは <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a> の期間ユーザのブラウザに保持されます。これにより、ユーザはブラウザを開くたびにログインし直さずに済みます。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定すると、Django はブラウザ起動中のみ有効なクッキーを使用します。このクッキーは、ブラウザを閉じた瞬間に破棄されます。ユーザがブラウザを開くたびにログインするようにしたい場合には、この設定を利用してください。</p>\n<p>この設定はグローバルなデフォルトですが、1セッションごとのレベルで設定を上書きすることができます。その場合には、上の <a class=\"reference internal\" href=\"#using-sessions-in-views\">using sessions in views</a> で書いたようにして、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> の <a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.set_expiry\" title=\"django.contrib.sessions.backends.base.SessionBase.set_expiry\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_expiry()</span></code></a> メソッドを呼び出してください。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>Some browsers (Chrome, for example) provide settings that allow users to\ncontinue browsing sessions after closing and reopening the browser. In\nsome cases, this can interfere with the\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a> setting and prevent sessions\nfrom expiring on browser close. Please be aware of this while testing\nDjango applications which have the\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a> setting enabled.</p>\n</aside>\n</section>\n<section id=\"clearing-the-session-store\">\n<span id=\"id2\"></span><h2>セッションストアのクリア<a class=\"heading-anchor\" href=\"#clearing-the-session-store\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ユーザがウェブサイトで新しいセッションを作成した時、セッションデータはセッションストアに溜め込まれます。データベースのバックエンドを使っている場合には、<code class=\"docutils literal notranslate\"><span class=\"pre\">django_session</span></code> データベーステーブルが増大し、ファイルバックエンドを使っている場合には、一時ディレクトリのファイル数が増えてゆくでしょう。</p>\n<p>この問題を理解するには、データベースバックエンドで起きていることを考えてみてください。ユーザがログインすると、Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">django_session</span></code> データベースのテーブルに1行を追加します。Django はセッションのデータが変更されるたびに、この行を更新します。ユーザが手動でログアウトすると、Django はこの行を削除します。しかし、ユーザがログアウト*しなかった*場合には、この行は決して削除されません。同様のプロセスが、ファイルバックエンドの場合にも発生します。</p>\n<p>Django は、有効期限の切れたセッションを自動的に削除する機能を提供*しません*。したがって、定期的に有効期限の切れたセッションを削除する仕事は、開発者の手に委ねられています。Django はこの目的のために、クリーンナップ用の管理コマンド <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-clearsessions\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">clearsessions</span></code></a> を用意しています。たとえば、cron の毎日のジョブに追加するなどの方法で、定期的にこのコマンドを実行することが推奨されています。</p>\n<p>キャッシュバックエンドの場合はこの問題が発生しないことに注意してください。キャッシュの場合、不要なデータは自動的に削除されるようになっているからです。しかし、クッキーバックエンドの場合はそうではありません。セッションデータはユーザのブラウザに保存されるからです。</p>\n</section>\n<section id=\"settings\">\n<h2>設定<a class=\"heading-anchor\" href=\"#settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以下の <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#settings-sessions\"><span class=\"std std-ref\">Django の設定</span></a> を使うと、セッションの振る舞いをコントロールすることができます。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_CACHE_ALIAS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_CACHE_ALIAS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_AGE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_DOMAIN</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_HTTPONLY</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_NAME</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_PATH</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_SAMESITE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_SECURE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_EXPIRE_AT_BROWSER_CLOSE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_EXPIRE_AT_BROWSER_CLOSE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_FILE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_FILE_PATH</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_SAVE_EVERY_REQUEST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_SAVE_EVERY_REQUEST</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_SERIALIZER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_SERIALIZER</span></code></a></p></li>\n</ul>\n</section>\n<section id=\"session-security\">\n<span id=\"topics-session-security\"></span><h2>セッションのセキュリティ<a class=\"heading-anchor\" href=\"#session-security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>サイトのサブドメインからは、クライアントに対して、ドメイン全体に対するクッキーを設定することができます。信頼できるユーザに管理されていないサブドメインから送られたクッキーを許可している場合、この方法で session fixation 攻撃が可能になってしまいます。</p>\n<p>For example, an attacker could log into <code class=\"docutils literal notranslate\"><span class=\"pre\">good.example.com</span></code> and get a valid\nsession for their account. If the attacker has control over <code class=\"docutils literal notranslate\"><span class=\"pre\">bad.example.com</span></code>,\nthey can use it to send their session key to you since a subdomain is permitted\nto set cookies on <code class=\"docutils literal notranslate\"><span class=\"pre\">*.example.com</span></code>. When you visit <code class=\"docutils literal notranslate\"><span class=\"pre\">good.example.com</span></code>,\nyou'll be logged in as the attacker and might inadvertently enter your\nsensitive personal data (e.g. credit card info) into the attacker's account.</p>\n<p>Another possible attack would be if <code class=\"docutils literal notranslate\"><span class=\"pre\">good.example.com</span></code> sets its\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_DOMAIN</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;example.com&quot;</span></code> which would cause\nsession cookies from that site to be sent to <code class=\"docutils literal notranslate\"><span class=\"pre\">bad.example.com</span></code>.</p>\n</section>\n<section id=\"technical-details\">\n<h2>技術的な詳細<a class=\"heading-anchor\" href=\"#technical-details\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>The session dictionary accepts any <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#module-json\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">json</span></code></a> serializable value when using\n<a class=\"reference internal\" href=\"#django.contrib.sessions.serializers.JSONSerializer\" title=\"django.contrib.sessions.serializers.JSONSerializer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONSerializer</span></code></a>.</p></li>\n<li><p>セッションデータは、データベースの <code class=\"docutils literal notranslate\"><span class=\"pre\">django_session</span></code> という名前のテーブルに保存されます。</p></li>\n<li><p>Django は必要なときにだけクッキーを送信します。新しくセッションデータを設定しなければ、Django はセッションクッキーを送信しません。</p></li>\n</ul>\n<section id=\"the-sessionstore-object\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> オブジェクト<a class=\"heading-anchor\" href=\"#the-sessionstore-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django が内部でセッションを操作する時は、対応するセッションエンジンの session store オブジェクトを使用します。慣習により、session store オブジェクトは <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> と名付けられていて、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SESSION_ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_ENGINE</span></code></a> で指定したモジュール内に置かれています。</p>\n<p>Django で利用可能なすべての <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> クラスは、<a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase\" title=\"django.contrib.sessions.backends.base.SessionBase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SessionBase</span></code></a> を継承していて、以下のデータを操作するメソッドを実装しています。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">exists()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">load()</span></code></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase.clear_expired\" title=\"django.contrib.sessions.backends.base.SessionBase.clear_expired\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clear_expired()</span></code></a></p></li>\n</ul>\n<p>独自のセッションエンジンを作ったり、既存のものをカスタマイズするには、<a class=\"reference internal\" href=\"#django.contrib.sessions.backends.base.SessionBase\" title=\"django.contrib.sessions.backends.base.SessionBase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SessionBase</span></code></a> か既存の <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> クラスを継承した新しいクラスを作る必要があるでしょう。</p>\n<p>You can extend the session engines, but doing so with database-backed session\nengines generally requires some extra effort (see the next section for\ndetails).</p>\n</section>\n</section>\n<section id=\"extending-database-backed-session-engines\">\n<span id=\"id3\"></span><h2>データベースを使ったセッションを拡張する<a class=\"heading-anchor\" href=\"#extending-database-backed-session-engines\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django に含まれるデータベースを使ったセッションエンジン (具体的に言えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code>) をカスタマイズするには、<a class=\"reference internal\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession\" title=\"django.contrib.sessions.base_session.AbstractBaseSession\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AbstractBaseSession</span></code></a> とともに <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> クラスを継承する必要があるかもしれません。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBaseSession</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseSessionManager</span></code> は、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions</span></code> を追加しなくても、<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.base_session</span></code> からインポートすることができます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">base_session.</span></span><span class=\"sig-name descname\"><span class=\"pre\">AbstractBaseSession</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ベースとなる抽象的なセッションのモデルです。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession.session_key\">\n<span class=\"sig-name descname\"><span class=\"pre\">session_key</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.session_key\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>プライマリーキーです。フィールド自体は40文字までの文字列を格納できますが、現在の実装では、32文字の文字列 (数字と小文字のASCII文字のランダムな列) を生成します。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession.session_data\">\n<span class=\"sig-name descname\"><span class=\"pre\">session_data</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.session_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>エンコード・シリアライズされた、セッションディクショナリーを含む文字列です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession.expire_date\">\n<span class=\"sig-name descname\"><span class=\"pre\">expire_date</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.expire_date\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>セッションの有効期限を表す datetime オブジェクトです。</p>\n<p>有効期限が切れたセッションをユーザが利用することはできませんが、<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-clearsessions\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">clearsessions</span></code></a> 管理コマンドを実行するまでは、ふつうはデータベースに保存されています。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession.get_session_store_class\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">get_session_store_class</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.get_session_store_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>セッションモデルで使用するセッションストアクラスを返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.AbstractBaseSession.get_decoded\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_decoded</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.AbstractBaseSession.get_decoded\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>デコードしたセッションデータを返します。</p>\n<p>デコードは、セッションストアのクラスで実行されます。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.contrib.sessions.base_session.BaseSessionManager\" title=\"django.contrib.sessions.base_session.BaseSessionManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseSessionManager</span></code></a> のサブクラスを作ることで、モデルマネージャをカスタマイズすることもできます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.BaseSessionManager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">base_session.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseSessionManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.BaseSessionManager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.BaseSessionManager.encode\">\n<span class=\"sig-name descname\"><span class=\"pre\">encode</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">session_dict</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.BaseSessionManager.encode\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与えられたセッションディクショナリを、シリアライズ・エンコードした文字列として返します。</p>\n<p>エンコードは、モデルクラスに関連付けられたセッションストアのクラスで実行されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.base_session.BaseSessionManager.save\">\n<span class=\"sig-name descname\"><span class=\"pre\">save</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">session_key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">session_dict</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expire_date</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.base_session.BaseSessionManager.save\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与えられたセッションキーに対するセッションデータを保存します。データが空の場合には、セッションを削除します。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionStore</span></code> クラスのカスタマイズは、以下に挙げるメソッドやプロパティをオーバーライドすることで行えます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.db.SessionStore\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">backends.db.</span></span><span class=\"sig-name descname\"><span class=\"pre\">SessionStore</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.db.SessionStore\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>データベースを使ったセッションストアを実装しています。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.db.SessionStore.get_model_class\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">get_model_class</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.db.SessionStore.get_model_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>カスタマイズしたセッションモデルを返す必要がある場合には、このメソッドをオーバーライドします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.db.SessionStore.create_model_instance\">\n<span class=\"sig-name descname\"><span class=\"pre\">create_model_instance</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">data</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.db.SessionStore.create_model_instance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>現在のセッションの状態を表す、セッションモデルオブジェクトの新しいインスタンスを返します。</p>\n<p>このメソッドをオーバーライドすると、セッションモデルのデータをデータベースへ保存する前に修正することができます。</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.cached_db.SessionStore\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">backends.cached_db.</span></span><span class=\"sig-name descname\"><span class=\"pre\">SessionStore</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.cached_db.SessionStore\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>キャッシュデータベースを使ったセッションストアを実装しています。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.backends.cached_db.SessionStore.cache_key_prefix\">\n<span class=\"sig-name descname\"><span class=\"pre\">cache_key_prefix</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.backends.cached_db.SessionStore.cache_key_prefix\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>キャッシュのキー文字列を作るためにセッションキーに追加するプリフィックスです。</p>\n</dd></dl>\n\n</dd></dl>\n\n<section id=\"example\">\n<h3>カスタマイズ例<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The example below shows a custom database-backed session engine that includes\nan additional database column to store an account ID (thus providing an option\nto query the database for all active sessions for an account):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sessions.backends.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SessionStore</span> <span class=\"k\">as</span> <span class=\"n\">DBStore</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sessions.base_session</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AbstractBaseSession</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomSession</span><span class=\"p\">(</span><span class=\"n\">AbstractBaseSession</span><span class=\"p\">):</span>\n    <span class=\"n\">account_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">db_index</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@classmethod</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_session_store_class</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">SessionStore</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SessionStore</span><span class=\"p\">(</span><span class=\"n\">DBStore</span><span class=\"p\">):</span>\n    <span class=\"nd\">@classmethod</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_model_class</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">CustomSession</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">create_model_instance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">):</span>\n        <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">create_model_instance</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">account_id</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;_auth_user_id&quot;</span><span class=\"p\">))</span>\n        <span class=\"k\">except</span> <span class=\"p\">(</span><span class=\"ne\">ValueError</span><span class=\"p\">,</span> <span class=\"ne\">TypeError</span><span class=\"p\">):</span>\n            <span class=\"n\">account_id</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n        <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">account_id</span> <span class=\"o\">=</span> <span class=\"n\">account_id</span>\n        <span class=\"k\">return</span> <span class=\"n\">obj</span>\n</code></pre></div>\n<p>If you are migrating from the Django's built-in <code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code> session store to\na custom one based on <code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code>, you should override the cache key prefix\nin order to prevent a namespace clash:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SessionStore</span><span class=\"p\">(</span><span class=\"n\">CachedDBStore</span><span class=\"p\">):</span>\n    <span class=\"n\">cache_key_prefix</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;mysessions.custom_cached_db_backend&quot;</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"session-ids-in-urls\">\n<h2>Session IDs in URLs<a class=\"heading-anchor\" href=\"#session-ids-in-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The Django sessions framework is entirely, and solely, cookie-based. It does\nnot fall back to putting session IDs in URLs as a last resort, as PHP does.\nThis is an intentional design decision. Not only does that behavior make URLs\nugly, it makes your site vulnerable to session-ID theft via the &quot;Referer&quot;\nheader.</p>\n</section>","rootId":"module-django.contrib.sessions","toc":[{"title":"セッションを有効にする","anchor":"enabling-sessions","children":[]},{"title":"セッションエンジンを設定する","anchor":"configuring-the-session-engine","children":[{"title":"データベースを使ったセッション","anchor":"using-database-backed-sessions","children":[]},{"title":"キャッシュを使ったセッション","anchor":"using-cached-sessions","children":[]},{"title":"ファイルを使ったセッション","anchor":"using-file-based-sessions","children":[]},{"title":"クッキーを使ったセッション","anchor":"using-cookie-based-sessions","children":[]}]},{"title":"ビューでセッションを使う","anchor":"using-sessions-in-views","children":[{"title":"セッションのシリアライズ","anchor":"session-serialization","children":[{"title":"バンドルされているシリアライザ","anchor":"bundled-serializers","children":[]},{"title":"自作のシリアライザを書く","anchor":"write-your-own-serializer","children":[]}]},{"title":"セッションオブジェクトのガイドライン","anchor":"session-object-guidelines","children":[]},{"title":"例","anchor":"examples","children":[]}]},{"title":"テストクッキーを設定する","anchor":"setting-test-cookies","children":[]},{"title":"ビューの外でセッションを使う","anchor":"using-sessions-out-of-views","children":[]},{"title":"セッションが保存されるタイミング","anchor":"when-sessions-are-saved","children":[]},{"title":"ブラウザ起動中のみ有効なセッション vs. 永続的なセッション","anchor":"browser-length-sessions-vs-persistent-sessions","children":[]},{"title":"セッションストアのクリア","anchor":"clearing-the-session-store","children":[]},{"title":"設定","anchor":"settings","children":[]},{"title":"セッションのセキュリティ","anchor":"session-security","children":[]},{"title":"技術的な詳細","anchor":"technical-details","children":[{"title":"SessionStore オブジェクト","anchor":"the-sessionstore-object","children":[]}]},{"title":"データベースを使ったセッションを拡張する","anchor":"extending-database-backed-session-engines","children":[{"title":"カスタマイズ例","anchor":"example","children":[]}]},{"title":"Session IDs in URLs","anchor":"session-ids-in-urls","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/4.2/topics/"},{"docname":"topics/http/index","title":"HTTP リクエストのハンドリング","url":"/ja/4.2/topics/http/"}],"prev":{"docname":"topics/http/middleware","title":"ミドルウェア (Middleware)","url":"/ja/4.2/topics/http/middleware/"},"next":{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/4.2/topics/forms/"},"formats":{"html":"/ja/4.2/topics/http/sessions/","markdown":"/ja/4.2/topics/http/sessions.md","json":"/ja/4.2/topics/http/sessions.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/topics/http/sessions.txt","official":"https://docs.djangoproject.com/ja/4.2/topics/http/sessions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}