こんにちは。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でのセッション管理を学習しましょう。