[django] templateをrenderしつつcookie登録したいからresponceも弄りたいとき

最終更新日

何も考えずにviewのreturnはrenderを使っていたんですが、cookieも食わせたいという要望が出てきまして、色々調べて以下にたどり着きました。

最初のうちはmiddlewareに手を出さなきゃダメか、、、と絶望的な気分に堕ちていましたがなんとかそこに手を出さずに済みました。

#某viewクラスの中

        # cookieデータも含めてHttpResponceで処理 renderは使わぬ
        template = loader.get_template('accounts/RegistUser/result.html')
        responce = HttpResponse(
            template.render(
                    context, 
                    request
            )
        )
        responce.set_cookie("hoge_key", value="value", max_age=3600, path='/', domain=None, secure=None)
#        return render(request, 'accounts/RegistUser/result.html', context)
        return responce

どうせrenderもHttpResponseを返すんだから最悪renderのビルトイン関数いじるか、、、などとmiddlewareいじるのと同じかそれ以上の精神的障壁があることを考えていましたがこんな感じでいけました。

最初はフロントエンドの方でjavascriptで「ボタン押したらcookie登録」なんてやってたんですが、あんまりフロント側でそういうことやるのもどうかなー、ってのと、そうやってcookie登録するとmax_ageが一週間以上を登録できなかったんですよね。

まあセキュリティ上あんまり長く生かしておくのは良くないので悪い仕様じゃないと思うんですが、どこを調べても「javascriptからはcookie最長1週間生存だぜ」、みたいな記述がないのでなんだかなあ、、、と思ってて、じゃあバックエンド側でやってみるか、、、と思ってやってみたら楽勝に一週間を突破してくれました。セキュリティ上なんですかね。javascriptからcookieは一週間なんでしょうか。

max_age=31536000 にすれば一年生きます。

もっとスマートなやり方がある気がしますが、、、。

以上よろしくお願いいたします。