2-10. Cookieへのデータの保存と読み出し

今回のテーマは「Cookieへのデータの保存と読み出し」です。前回セッションでのデータの扱いを見てきました。今回はCookieのデータ保存とデータの読み出しを見ていきます。

※本ページはセッションへのデータの保存と読み出しまで読まれた方を対象としています。そのためサンプルソースコードが省略されている場合があります。

Cookieにデータを保管することについて

Djangoに限らない話ですがクッキーはユーザーサイドでデータの操作が可能である点、クッキーが盗難にあう可能性があることを考慮し、セキュリティ重要なデータや個人情報などを保存してはいけません。あくまでページを跨ぐ情報の一時的な保管場所として利用するのが望ましいかと考えています。

Cookieへ値をセットと取得

HttpResposeクラスのset_cookieメソッドを利用してセットします。ここでは例としてトピック作成した際にカテゴリーIDを保存してみます。あまりいい例が思いうかばず申し訳ないです。次回のトピック作成時には前回作成したカテゴリーが予め選択されているようにします。thread/views.pyの先程作成したTocicCreateViewBySessionクラスを修正します。
thread/views.py(一部抜粋)


  class TocicCreateViewBySession(FormView):
      template_name = 'thread/create_topic.html'
      form_class = TopicModelForm
  
      def post(self, request, *args, **kwargs):
          ctx = {}
          if request.POST.get('next', '') == 'back':
              if 'input_data' in self.request.session:
                  input_data = self.request.session['input_data']
                  form = TopicModelForm(input_data)
                  ctx['form'] = form
              return render(request, self.template_name, ctx)
          elif request.POST.get('next', '') == 'create':
              if 'input_data' in request.session:
                  Topic.objects.create_topic(
                      title=request.session['input_data']['title'],
                      user_name=request.session['input_data']['user_name'],
                      category_id=request.session['input_data']['category'],
                      message=request.session['input_data']['message']
                  )
                  # メール送信処理は省略
+                 response = redirect(reverse_lazy('base:top'))
+                 response.set_cookie('categ_id', request.session['input_data']['category'])
+                 request.session.pop('input_data') # セッションに保管した情報の削除
+                 return response
          elif request.POST.get('next', '') == 'confirm':
              form = TopicModelForm(request.POST)
              if form.is_valid():
                  ctx = {'form': form}
                  # セッションにデータを保存
                  input_data = {
                      'title': form.cleaned_data['title'],
                      'user_name': form.cleaned_data['user_name'],
                      'message': form.cleaned_data['message'],
                      'category': form.cleaned_data['category'].id,
                  }
                  request.session['input_data'] = input_data
                  ctx['category'] = form.cleaned_data['category']
                  return render(request, 'thread/confirm_topic.html', ctx)
              else:
                  return render(request, self.template_name, {'form': form})
          
+     def get_context_data(self):
+         ctx = super().get_context_data()
+         if 'categ_id' in self.request.COOKIES:
+             form = ctx['form']
+             form['category'].field.initial = self.request.COOKIES['categ_id']
+             ctx['form'] = form
+         return ctx

簡単に解説します。set_cookieメソッドはHttpResposeの属性です。なのでredirect関数で生成されたHttpResponseオブジェクトresponseからset_cookieメソッドを呼びます。引数にキーとバリューを入れて設定しています。有効期限を引数に入れることで有効期限の設定も出来ます。

セットした値を取得するにはrequest.COOKIESにアクセスすることで取得できます。今回はget_context_data関数の中でCookieの値を取得してカテゴリーの初期値を設定する操作を行っています。

最後に

ちょっと強引な例となってしまいましたが、Cookieの使用方法を紹介しました。次回はファイルを扱う方法を見ていきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です