Set a cookie. ``expires`` can be: - a string in the correct format, - a naive ``datetime.datetime`` object in UTC, - an aware ``datetime.datetime`` object in any time zone. If it is a ``datetime.datetime`` object then calculate ``max_age``.
(
self,
key,
value="",
max_age=None,
expires=None,
path="/",
domain=None,
secure=False,
httponly=False,
samesite=None,
)
| 216 | return self.headers.get(header, alternate) |
| 217 | |
| 218 | def set_cookie( |
| 219 | self, |
| 220 | key, |
| 221 | value="", |
| 222 | max_age=None, |
| 223 | expires=None, |
| 224 | path="/", |
| 225 | domain=None, |
| 226 | secure=False, |
| 227 | httponly=False, |
| 228 | samesite=None, |
| 229 | ): |
| 230 | """ |
| 231 | Set a cookie. |
| 232 | |
| 233 | ``expires`` can be: |
| 234 | - a string in the correct format, |
| 235 | - a naive ``datetime.datetime`` object in UTC, |
| 236 | - an aware ``datetime.datetime`` object in any time zone. |
| 237 | If it is a ``datetime.datetime`` object then calculate ``max_age``. |
| 238 | |
| 239 | ``max_age`` can be: |
| 240 | - int/float specifying seconds, |
| 241 | - ``datetime.timedelta`` object. |
| 242 | """ |
| 243 | self.cookies[key] = value |
| 244 | if expires is not None: |
| 245 | if isinstance(expires, datetime.datetime): |
| 246 | if timezone.is_naive(expires): |
| 247 | expires = timezone.make_aware(expires, datetime.UTC) |
| 248 | delta = expires - datetime.datetime.now(tz=datetime.UTC) |
| 249 | # Add one second so the date matches exactly (a fraction of |
| 250 | # time gets lost between converting to a timedelta and |
| 251 | # then the date string). |
| 252 | delta += datetime.timedelta(seconds=1) |
| 253 | # Just set max_age - the max_age logic will set expires. |
| 254 | expires = None |
| 255 | if max_age is not None: |
| 256 | raise ValueError("'expires' and 'max_age' can't be used together.") |
| 257 | max_age = max(0, delta.days * 86400 + delta.seconds) |
| 258 | else: |
| 259 | self.cookies[key]["expires"] = expires |
| 260 | else: |
| 261 | self.cookies[key]["expires"] = "" |
| 262 | if max_age is not None: |
| 263 | if isinstance(max_age, datetime.timedelta): |
| 264 | max_age = max_age.total_seconds() |
| 265 | self.cookies[key]["max-age"] = int(max_age) |
| 266 | # IE requires expires, so set it if hasn't been already. |
| 267 | if not expires: |
| 268 | self.cookies[key]["expires"] = http_date(time.time() + max_age) |
| 269 | if path is not None: |
| 270 | self.cookies[key]["path"] = path |
| 271 | if domain is not None: |
| 272 | self.cookies[key]["domain"] = domain |
| 273 | if secure: |
| 274 | self.cookies[key]["secure"] = True |
| 275 | if httponly: |
no test coverage detected