Django-セッション

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

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

セッションの設定

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

'django.contrib.sessions.middleware.SessionMiddleware'

そして INSTALLED_APPS 持っている必要があります-

'django.contrib.sessions'

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

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

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

このために、最初にログインビューを変更して、ユーザー名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, 'loggedin.html', {"username" : username}

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

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

次に、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を返します。