Django-sessions

提供:Dev Guides
移動先:案内検索

Django-セッション

前に説明したように、クライアント側のCookieを使用して、Webアプリに役立つ多くのデータを保存できます。 以前、クライアント側のCookieを使用して、Webアプリに役立つさまざまなデータを保存できることを確認しました。 これにより、保存するデータの重要性に応じて、多くのセキュリティホールが発生します。

セキュリティ上の理由から、DjangoにはCookieを処理するためのセッションフレームワークがあります。 セッションはCookieの送受信を抽象化するために使用され、データはサーバー側(データベースなど)に保存され、クライアント側のCookieには識別用のセッションIDのみが含まれます。 セッションは、ユーザーのブラウザーがCookieを「受け入れない」に設定されている場合を回避するのにも役立ちます。

セッションのセットアップ

Djangoでは、 MIDDLEWARE_CLASSES および INSTALLED_APPS オプションにいくつかの行を追加することにより、プロジェクトの settings.py でセッションを有効にします。 これはプロジェクトの作成中に行う必要がありますが、常に知っておくとよいので、 MIDDLEWARE_CLASSES には次のようにする必要があります-

'django.contrib.sessions.middleware.SessionMiddleware'

そして、 INSTALLED_APPS には次が必要です-

'django.contrib.sessions'

デフォルトでは、Djangoはセッション情報をデータベース(django_sessionテーブルまたはコレクション)に保存しますが、 file または cache などの他の方法を使用して情報を保存するようにエンジンを設定できます。

セッションが有効な場合、すべてのリクエスト(Djangoのビューの最初の引数)にはセッション(dict)属性があります。

簡単なサンプルを作成して、セッションを作成および保存する方法を見てみましょう。 以前に簡単なログインシステムを構築しました(Djangoフォーム処理の章とDjango Cookiesの処理の章を参照)。 ユーザー名をCookieに保存して、ログアウトしていない場合、ログインページにアクセスしたときにログインフォームが表示されないようにします。 基本的に、Django Cookieの処理で使用したログインシステムを、Cookieのサーバー側を保存することで、より安全にします。

このため、まずログインビューを変更して、ユーザー名Cookieサーバー側を保存します-

def login(request):
   username = 'not logged in'

   if request.method == 'POST':
      MyLoginForm = LoginForm(request.POST)

      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
         request.session['username'] = username
      else:
         MyLoginForm = LoginForm()

   return render(request, 'loggedinl', {"username" : username}

次に、ログインフォームのformViewビューを作成します。Cookieが設定されている場合、フォームは表示されません-

def formView(request):
   if request.session.has_key('username'):
      username = request.session['username']
      return render(request, 'loggedinl', {"username" : username})
   else:
      return render(request, 'loginl', {})

次に、url.pyファイルを変更してURLを変更し、新しいビューとペアにします。

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/','formView', name = 'loginform'),
   url(r'^login/', 'login', name = 'login'))

/myapp/connectionにアクセスすると、次のページが表示されます-

セッションのセットアップ

そして、あなたは次のページにリダイレクトされます-

リダイレクトされたセッションページ

ここで/myapp/connectionに再度アクセスしようとすると、2番目の画面に直接リダイレクトされます。

Cookieを消去する簡単なログアウトビューを作成しましょう。

def logout(request):
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse("<strong>You are logged out.</strong>")

そして、myapp/url.pyのログアウトURLとペアにします

url(r'^logout/', 'logout', name = 'logout'),

さて、/myapp/logoutにアクセスすると、次のページが表示されます-

ログアウトページ

/myapp/connectionに再度アクセスすると、ログインフォームが表示されます(画面1)。

セッションを使用したその他の可能なアクション

セッションを保存してアクセスする方法を見てきましたが、リクエストのセッション属性には、次のような他の便利なアクションがあることを知っておくと便利です-

  • * set_expiry(_value _)*-セッションの有効期限を設定します。
  • * get_expiry_age()*-このセッションが期限切れになるまでの秒数を返します。
  • * get_expiry_date()*-このセッションが期限切れになる日付を返します。
  • * clear_expired()*-期限切れのセッションをセッションストアから削除します。
  • * get_expire_at_browser_close()*-ユーザーのWebブラウザーが閉じられたときにユーザーのセッションCookieの有効期限が切れているかどうかに応じて、TrueまたはFalseを返します。