【Django】セッションとミドルウェアを使用する

セッションの働き

セッションを利用することでアクセスしたクライアントの情報をずっと維持することができます。
このセッションは、Djangoプロジェクトに最初から組み込まれています。
settings.pyのINSTALLED_APPSとMIDDLEWAREという値になります。

django_app/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions', #セッション用
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'hello',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',  #セッション用
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

セッションの基本操作

セッションに値を保管する

<HttpRequest>.session[キー]=値

セッションから値を取り出す

変数 = <HttpRequest>.session[キー]

値を取得する

<HttpRequest>.session.get(キー,デフォルト値)

値を取得しセッションから取り除く

<HttpRequest>.session.pop(キー,デフォルト値)

セッションを利用する

hello/forms.py

from django import forms

class SessionForm(forms.Form):
  session = forms.CharField(label='session', required=False, \
    widget=forms.TextInput(attrs={'class':'form-control'}))

hello/views.py

from django.shortcuts import render
from django.views.generic import TemplateView

from .forms import SessionForm

class HelloView(TemplateView):
    
  def __init__(self):
    self.params = {
      'title': 'Hello',
      'form': SessionForm(),
      'result':None
    }
  
  def get(self, request):
    self.params['result'] = request.session.get('last_msg', 'No message.')
    return render(request, 'hello/index.html', self.params)

  def post(self, request):
    ses = request.POST['session']
    self.params['result'] = 'send: "' + ses + '".'
    request.session['last_msg'] = ses
    self.params['form'] = SessionForm(request.POST)
    return render(request, 'hello/index.html', self.params)

resultには、last_msgセッションの値か、またはNo messageというテキストが設定されます。

self.params['result'] = request.session.get('last_msg', 'No message.')

フォームから送信されたsessionという値を変数sesに取り出しておき、この値をresultパラメータとlast_msgセッションに保管しています。

ses = request.POST['session']
    self.params['result'] = 'send: "' + ses + '".'
    request.session['last_msg'] = ses

webブラウザにてアクセスします。

適当な値を入力して「click」をクリックします。

セッションに保存されているので、何度アクセスしてもセッションが更新されるまで同じ値が表示されます。

セッションの機能

セッションの全キー/値を取得する

<SessionBase>.keys()
<SessionBase>.items()

セッションの全値を消去する

<SessionBase>.clear()
<SessionBase>.flush()

保持期間を設定する

<SessionBase>.set_expiry()

ミドルウェアとは

ミドルウェアはクライアントから要求を受けて処理を行う過程に割り込んで何らかの処理を行うプログラムです。

settings.pyに規定されています。作成したミドルウェアはsettings.pyで登録しなければなりません。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

views.pyにミドルウェアを作成します。

hello/views.py

from django.shortcuts import render
from django.views.generic import TemplateView

from .forms import SessionForm

class HelloView(TemplateView):
    
  def __init__(self):
    self.params = {
      'title': 'Hello',
      'form': SessionForm(),
      'result':None
    }
  
  def get(self, request):
    self.params['result'] = request.session.get('last_msg', 'No message.')
    return render(request, 'hello/index.html', self.params)

  def post(self, request):
    ses = request.POST['session']
    self.params['result'] = 'send: "' + ses + '".'
    request.session['last_msg'] = ses
    self.params['form'] = SessionForm(request.POST)
    return render(request, 'hello/index.html', self.params)

#ミドルウェアを作成
def sample_middleware(get_response):

  def middleware(request):
    counter = request.session.get('counter', 0)
    request.session['counter'] = counter + 1
    response = get_response(request)
    print("count: " + str(counter))
    return response

  return middleware

アクセスされる度にカウンタの値が出力されていきます。

settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'hello.views.sample_middleware', #追加
]

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。