Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

Djangoのresponse.set_cookieはmax_ageを指定すればexpiresが勝手に計算される

DjangoCookieを設定するときは response.set_cookie を使います。

response = TemplateResponse(...)
response.set_cookie("key", "value", max_age=3600)

今まで知らずに expires も自分で計算して設定していましたが、 max_age を指定して expires を指定しない場合は勝手に設定されるので不要みたいです。

DjangoのHttpResponseBaseのset_cookieにこういう実装がありました(Django 2.1で確認)。

        if max_age is not None:
            self.cookies[key]['max-age'] = max_age
            # IE requires expires, so set it if hasn't been already.
            if not expires:
                self.cookies[key]['expires'] = http_date(time.time() + max_age)

django/response.py at 2.1.7 · django/django · GitHub

なので、わざわざこういう関数を作る必要はないです。

from datetime import timedelta

from django.utils import timezone


def set_cookie(response, key, value, max_age):
    expires_at = timezone.now() + timedelta(seconds=max_age)
    expires = datetime.strftime(expires_at, "%a, %d-%b-%Y %H:%M:%S GMT")
    response.set_cookie(key, value, max_age=max_age, expires=expires)

ちゃんと実装を調べてよかった。