【Django入門】sessionの使い方

こんにちは。ryoです。

今回はDjangoにおけるsessionについて解説していきたいと思います。

sessionを活用することで、cookie(クッキー)を扱うことが出来るようになります。

この記事では

・sessionとは
・sessionを使う準備
・view内でsessionを使う方法

といった基本的な内容から

・view外でsessionを使う方法

といった発展的なことまで解説します。

sessionとは

sessionとは何かをご存知でしょうか。

sessionとは、通信の始まりから終わりまでを一つの単位としたまとまりのことです。

Djangoではsessionフレームワークを使うことで、データをサイト訪問者単位で扱うことが出来るようになります。

sessionでは主にログインページなどでログインしているかどうかなどを管理します。

あくまでも、一つの通信に対して使われるのではなくてログインからログアウトまでを1つのsessionとして扱います。

sessionを使う準備

Djangoでsessionを使うにはまず、sessionを有効化する必要があります。

これからはmySiteというプロジェクトの中にmyappというWebアプリケーションを作った状態を仮定して解説します。

現在のディレクトリ構成はこのようになっています。

mySite
├── manage.py
├── mySite
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── myapp
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py
 
4 directories, 14 files

sessionを有効化する方法

まずは、mySite/settings.pyをテキストエディタで開きましょう。

そして、このようなコードを追加しましょう。

INSTALLED_APPS = [
'django.contrib.sessions',
]
MIDDLEWARE = [
'django.contrib.session.middleware.SessionMiddleware',
]

つまり、sessionを利用するには、MIDDLEWARE'django.contrib.sessions.middleware.SessionMiddleware'を追加する必要があります。

そして、INSTALLED_APPSを編集し、'django.contrib.sessions'を挿入します。

これはDjangoにsessionを使うための機能を使うことを知らせるための操作です。

どちらもWebアプリケーションを作成した時点ではデフォルトで記述されているかと思います。

sessionエンジンの設定方法

Djangoのデフォルト設定では、セッションはデータベースに保存されるようになっています。

保存場所をキャッシュ上やファイルシステムへ変更する場合は、以下の通りにsessionエンジンを設定しましょう。

今回編集するファイルもmySite/settings.pyになります。

ファイルベースのセッションを使うには、SESSION_ENGINEの設定を‘django.contrib.sessions.backends.file’にします。

SESSION_ENGINE = 'django.contrib.sessions.backends.file'

Djangoのキャッシュにセッションデータを保存するには、SESSION_ENGINEに‘django.contrib.sessions.backends.cache’を設定してください。

SESSION_ENGINE = ‘django.contrib.sessions.backends.cache'

SESSION_ENGINEは最初の設定には書かれていないので、自分で書く必要があります。

場所はどこでも良いですが、読みやすさを考慮してMIDDLEWAREの下に書くと良いでしょう。

viewの中でsessionを使う方法

Djangoではviewでsessionの処理を行うのが一般的です。

このサンプルコードを見てみましょう。

def post_comment(request, new_comment):
    if request.session.get('has_commented', False):
        return HttpResponse("You've already commented.")
    c = comments.Comment(comment=new_comment)
    c.save()
    request.session['has_commented'] = True
    return HttpResponse('Thanks for your comment!')

これは公式ドキュメントにあるコードです。

この関数ではユーザーがコメントをポストした時にhas_commentedという変数を利用しています。

この変数で1人のユーザーに同じコメントを何度も投稿させないようにしています。

Twitterでも同じ投稿が出来ないようになっています。

これに似た機能をDjangoではsessionを使って実現することが出来ます。

viewの外でsessionを使う方法

Django shellを使うことで、sessionをviewから使うことが出来ます。

こちらは少々発展的な内容ではありますが、データベースを直接触ってsessionを扱うことで、より理解が深まります。

>>> from django.contrib.sessions.backends.db import SessionStore
>>> import datetime
>>> s = SessionStore(session_key='2b1189a188b44ad18c35e113ac6ceead')
>>> s['last_login'] = datetime.now()
>>> s['last_login']
datetime.datetime((現在の時刻))
>>> s.save()

こちらも公式ドキュメントからの引用になります。

このコードではデータベースを利用して、last_loginに現在の時刻を入れています。

まとめ

今回は、Djangoにおけるsessionの基本について学びました。

sessionはviewの中で使うことが基本ですが、Django shellで外部からも触ることが出来ます。

またsessionを使うことでアカウント情報を利用したWebサイトを作ることが出来るようになります。

そのアカウント情報によって機能を制限するようなサイトでは、このような知識は必須になります。

ぜひこの記事で、Djangoでのセッション管理を学習しましょう。

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

ryo

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説