今回のテーマは「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の使用方法を紹介しました。次回はファイルを扱う方法を見ていきます。
Sponsored Link