February 9, 2021
←前回:Day 30 セッションへのデータの保存と読み出し
「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。
#はじめに
前回セッションでのデータの扱いを見てきました。今回はCookieのデータ保存とデータの読み出しを見ていきます。
#Cookieにデータを保管することについて
Djangoに限らない話ですがクッキーはユーザーサイドでデータの操作が可能である点、クッキーが盗難にあう可能性があることを考慮し、セキュリティ重要なデータや個人情報などを保存してはいけません。あくまでページを跨ぐ情報の一時的な保管場所として利用するのが望ましいかと考えています。
#Cookieへ値をセットと取得
HttpResposeクラスのset_cookieメソッドを利用してセットします。ここでは例としてトピック作成した際にカテゴリーIDを保存してみます。あまりいい例が思いうかばず申し訳ないです。次回のトピック作成時には前回作成したカテゴリーが予め選択されているようにします。thread/views.pyの先程作成したTocicCreateViewBySessionクラスを修正します。
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年生よりも成績がいいので優秀賞は確実です。
とまあ、最後は自慢になってしまいましたが、睡眠は大事だよってことが若いうちに知ることができてよかったです。
それではまたまた