This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

[Day 31]Cookieへのデータの保存と読み出し

Last updated at Posted at 2021-02-09

February 9, 2021
←前回:Day 30 セッションへのデータの保存と読み出し

「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。

はじめに

前回セッションでのデータの扱いを見てきました。今回は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の値を取得してカテゴリーの初期値を設定する操作を行っています。

終わりに

今日はこれだけらしいです。お疲れ様でした。

コロナの影響で睡眠時間をかなり確保できる生活を送っています。
毎日7~8時間は必ずとっています。で、睡眠の質もデータとしてとっていまして、毎回80点は越えてきます。
大学一年生の時はバイトの関係上4~5時間しか取れておらず、試聴型の授業はほぼ寝ており、プログラミングの授業では起きてはいたものの全く頭が働いていませんでした。
睡眠を伸ばしたからかわかりませんが、2年生では優秀賞(大学トップ3)にはいることができ、3年生はまだ成績出ていませんが、2年生よりも成績がいいので優秀賞は確実です。
とまあ、最後は自慢になってしまいましたが、睡眠は大事だよってことが若いうちに知ることができてよかったです。

それではまたまた

←前回:Day 30 セッションへのデータの保存と読み出し
→次回:Day 32 画像アップロード機能を付与する

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up