{"title":"セッションの使いかた","version":"2.1","locale":"ja","docname":"topics/http/sessions","url":"/ja/2.1/topics/http/sessions/","canonical":"https://djangodocs.dev/ja/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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 キャッシュバックエンドを使用している場合だけにするべきです。ローカルなメモリキャッシュバックエンドを使用している場合、長時間データをメモリ上に保持しておくのは良い考えではありませんし、全てのデータをファイルやデータベースキャッシュバックエンドを通して送信するよりも、ファイルやデータベースに保存されたセッションから直接送信した方が高速だからです。加えて、ローカルなメモリキャッシュバックエンドは、マルチプロセスに対して安全「ではありません」。したがって、実環境ではあまり良い選択とは言えないでしょう。</p>\n</aside>\n<p>設定ファイルの <a class=\"reference internal\" href=\"/ja/2.1/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/2.1/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>キャッシュの設定が完了したら、キャッシュへのデータの保管方法を、次の2つの選択肢から選ぶことができます。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/2.1/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.cache&quot;</span></code> に設定すると、シンプルなキャッシュセッションを保存します。セッションデータはキャッシュに直接保存されることになります。しかし、この場合、セッションデータが永続化されず、キャッシュがいっぱいになったりキャッシュサーバが再起動した際に、一度キャッシュされていたデータがクリアされてしまうことがあります。</p></li>\n<li><p>キャッシュデータを確実に永続化したい場合には、<a class=\"reference internal\" href=\"/ja/2.1/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.cached_db&quot;</span></code> に設定します。こちらは、書き込み透過な (write-through) キャッシュを使用します。つまり、キャッシュにデータが書き込まれるのと同時に、データベースにも同じデータが書き込まれます。セッションは、データがキャッシュ上から読み込めない時に限り、データベースからデータを読み込みます。</p></li>\n</ul>\n<p>いずれのセッションのデータの保存も非常に高速ですが、シンプルなキャッシュを使用した方が、永続化の処理をしないので、より高速です。ほとんどのケースでは <code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code> バックエンドでも十分高速ですが、パフォーマンスを最重視していて、セッションデータが時間経過で失われてもかまわない場合には、<code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> バックエンドを使用すると良いでしょう。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cached_db</span></code> セッションバックエンドを使用する場合には、<a class=\"reference internal\" href=\"#using-database-backed-sessions\">using database-backed sessions</a> に書かれている手順にしたがって、設定を行ってください。</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/2.1/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/2.1/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> になっています。)。Web サーバが設定した場所の読み書きの権限を持っていることを確認しておいてください。</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/2.1/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/2.1/topics/signing/\"><span class=\"doc\">暗号化署名</span></a> のための Django のツールと <a class=\"reference internal\" href=\"/ja/2.1/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/2.1/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><strong>SECRET_KEY が知られてしまい、</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/2.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</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クッキーごとの  <a class=\"reference external\" href=\"https://tools.ietf.org/html/rfc2965#section-5.3\">common limit of 4096 bytes</a> を超えてしまうことは十分に考えられることです。</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/2.1/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>最後に、クッキーのサイズが大きくなると、 <a class=\"reference external\" href=\"https://yuiblog.com/blog/2007/03/01/performance-research-part-3/\">speed of your site</a> にも大きな影響があります。</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/2.1/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/2.1/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.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>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">timedelta</span></code> オブジェクトならば、指定された日時に破棄されます。<code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">timedelta</span></code> の値がシリアライズできるのは、<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> を使っている場合のみであることに注意してください。</p></li>\n<li><p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> ならば、ユーザのセッションクッキーは、ユーザがウェブブラウザを閉じた時に破棄されます。</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/2.1/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</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/2.1/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=\"#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> と同じキーワード引数を取ることができます。</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>ユーザのセッションクッキーがユーザのブラウザが閉じた時に破棄されるかどうかに応じて、<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">False</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.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/2.1/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/2.1/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/2.1/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 によるシリアライズを強く推奨します。<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">*</span></a>クッキーバックエンドを利用している場合は特にです。</p>\n<p>たとえば、セッションデータをシリアライズするために <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> を使用していた場合の、こんな攻撃のシナリオを考えてみましょう。あなたは <a class=\"reference internal\" href=\"#cookie-session-backend\"><span class=\"std std-ref\">署名したクッキーセッションバックエンド</span></a> を使用していて、<a class=\"reference internal\" href=\"/ja/2.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> が攻撃者に知られてしまっていたとします (もちろん、これは Django にキーが流出する脆弱性が内在しているというわけではありません)。この時、攻撃者は、セッションに任意の文字列を挿入することができてしまい、このセッションをアンピックすると、サーバ上で任意のコードが実行されてしまいます。このような攻撃は、インターネット上のどこからでも簡単にできてしまいます。クッキーセッションストレージは、クッキーに保存されているデータが勝手に書き換えられないようにクッキーに署名をしていますが、<a class=\"reference internal\" href=\"/ja/2.1/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<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/2.1/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>また、JSON は文字列のキーしかサポートしていないので、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</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=\"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=\"s1\">&#39;bar&#39;</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=\"s1\">&#39;0&#39;</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>任意の Python オブジェクトをサポートしますが、上に書いた理由により、このシリアライザを使用すると、攻撃者に <a class=\"reference internal\" href=\"/ja/2.1/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</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 unlike <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>,\nthe <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> cannot handle\narbitrary Python data types. As is often the case, there is a trade-off between\nconvenience and security. If you wish to store more advanced data types\nincluding <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 will need\nto write a custom serializer (or convert such values to a JSON serializable\nobject before storing them in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code>). While serializing these\nvalues is fairly straightforward\n(<a class=\"reference internal\" href=\"/ja/2.1/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=\"s1\">&#39;has_commented&#39;</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=\"s1\">&#39;has_commented&#39;</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=\"s1\">&#39;Thanks for your comment!&#39;</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=\"s1\">&#39;username&#39;</span><span class=\"p\">])</span>\n    <span class=\"k\">if</span> <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">password</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=\"s1\">&#39;password&#39;</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=\"s1\">&#39;member_id&#39;</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=\"s1\">&#39;member_id&#39;</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/2.1/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>便利のため、Django はユーザのブラウザがクッキーを受け入れることができるかどうかをテストするための簡単な方法を提供しています。テストをするには、一度ビューの中で <code class=\"docutils literal notranslate\"><span class=\"pre\">request.session</span></code> の <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> メソッドを呼び出してから、同じビューではなく、次に呼び出されるビューの中で、 <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> メソッドを呼び出すだけで良いです。</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<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=\"s1\">&#39;POST&#39;</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=\"s1\">&#39;foo/login_form.html&#39;</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/2.1/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=\"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=\"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>次のようにして、ビューの外からセッションデータを操作する API が利用可能です。</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=\"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=\"s1\">&#39;last_login&#39;</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=\"s1\">&#39;2b1189a188b44ad18c35e113ac6ceead&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"s1\">&#39;last_login&#39;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions.backends.db</span></code> バックエンドを使用している場合、各セッションは単なる Django のモデルになっていて、<code class=\"docutils literal notranslate\"><span class=\"pre\">Session</span></code> モデルは <code class=\"docutils literal notranslate\"><span class=\"pre\">django/contrib/sessions/models.py</span></code> で定義されています。普通のモデルにすぎないので、普通の Django データベース API からセッションにアクセスできます。</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=\"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=\"s1\">&#39;2b1189a188b44ad18c35e113ac6ceead&#39;</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>セッションのディクショナリを取得するには、<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> を呼ばなければならないことに注意してください。これが必要なのは、ディクショナリがエンコードされたフォーマットで保存されているためです。</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=\"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=\"s1\">&#39;foo&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;bar&#39;</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=\"s1\">&#39;foo&#39;</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=\"s1\">&#39;foo&#39;</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=\"s1\">&#39;foo&#39;</span><span class=\"p\">][</span><span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;baz&#39;</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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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>一部のブラウザ (たとえば Chrome) では、ブラウザを閉じて再度開いてもセッションを継続できるようにする設定が提供されています。場合によっては、この設定が <a class=\"reference internal\" href=\"/ja/2.1/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> 設定を妨げて、ブラウザが閉じてもセションが破棄されないことがあります。<a class=\"reference internal\" href=\"/ja/2.1/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> を有効にした Django アプリケーションのテストをする時には、この点に注意してください。</p>\n</aside>\n</section>\n<section id=\"clearing-the-session-store\">\n<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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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/2.1/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>たとえば、攻撃者が <code class=\"docutils literal notranslate\"><span class=\"pre\">good.example.com</span></code> にログインして、攻撃者のアカウントに対する有効なセッションを取得したとしましょう。この攻撃者が <code class=\"docutils literal notranslate\"><span class=\"pre\">bad.example.com</span></code> を自由に使えた場合、サブドメインからは <code class=\"docutils literal notranslate\"><span class=\"pre\">*.example.com</span></code> に対してクッキーを設定できるので、先ほど取得したセッションを利用して、攻撃者のセッションキーをターゲットの利用者に送信できてしまいます。次にこの利用者が <code class=\"docutils literal notranslate\"><span class=\"pre\">good.example.com</span></code> を訪問すると、この利用者は攻撃者のアカウントにログインすることになり、そのことに気付かずに大切な個人のデータ (たとえば、クレジットカード情報など) を攻撃者のアカウントに入力してしまう恐れがあります。</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/2.1/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>セッションのディクショナリは、<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> を使用している場合には <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> でシリアライズできるどんな値でも、<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> を使用している場合には pickle でシリアライズできるどんな Python オブジェクトでも、保存することができます。</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/2.1/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>大部分のセッションエンジンでは、拡張は簡単にできますが、データベースを使ったセッションエンジンの場合は、一般に少し手を加える必要があります (詳しくは次のセクションを読んでください)。</p>\n</section>\n</section>\n<section id=\"extending-database-backed-session-engines\">\n<span id=\"id2\"></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/2.1/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/2.1/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<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<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=\"s1\">&#39;_auth_user_id&#39;</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=\"s1\">&#39;mysessions.custom_cached_db_backend&#39;</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/2.1/topics/"},{"docname":"topics/http/index","title":"HTTP リクエストのハンドリング","url":"/ja/2.1/topics/http/"}],"prev":{"docname":"topics/http/middleware","title":"ミドルウェア (Middleware)","url":"/ja/2.1/topics/http/middleware/"},"next":{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/2.1/topics/forms/"},"formats":{"html":"/ja/2.1/topics/http/sessions/","markdown":"/ja/2.1/topics/http/sessions.md","json":"/ja/2.1/topics/http/sessions.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/http/sessions.txt","official":"https://docs.djangoproject.com/ja/2.1/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","pt-br","ko","es","el","pl"]}