Flask[携行]

Flask[携行]

七月 07, 2023

flask 设置cookie过期时间

如果不设置cookie的过期时间,则默认关闭浏览器时cookie过期。

flask设置过期时间,遵循下面的三条规则:

  1. max_age: 规定多少秒以后过期
  2. expires:datatime类型,使用此参数,需参照格林尼治时间,即北京时间-8个小时
  3. 如果max_age和expires都设置,则以max_age为主

设置了cookie过期时间,即便浏览器都关闭了,只要没有cookie还在有效期内,再次打开浏览器,cookie依然有效。

如果超过了cookie的过期时间,即便浏览器没有关闭,cookie也会失效。

只要设置了cookie的过期时间,是否失效就已经和浏览器是否关闭无关。

1. 通过max_age设置cookie有效期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask, make_response, request
from datetime import datetime

app = Flask(__name__)

@app.route("/")
def index():
# 尝试获取 first_access cookie
first_access = request.cookies.get('first_access')
if first_access is None: # 没有first_access cookie, 是第一次来
first_access = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
res = make_response('hello world')
res.set_cookie('first_access', first_access, max_age=60) # 在响应头里设置cookie
return res
else: # 不是第一次来
return f"你第一次访问这个网页的时间是: {first_access}"


if __name__ == '__main__':
app.run()

设置了cookie的过期时间是60秒,那么一分钟以后,再次访问时,页面里显示的内容就是hello world, 服务以为我是第一次来,原因是cookie已经失效,能够记录我第一次来访问的信息已经不存在了。

2. 通过expires 设置过期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask, make_response, request
from datetime import datetime

app = Flask(__name__)

@app.route("/")
def index():
# 尝试获取 first_access cookie
first_access = request.cookies.get('first_access')
if first_access is None: # 没有first_access cookie, 是第一次来
first_access = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
res = make_response('hello world')
expires_time = datetime(year=2021, month=9, day=7, hour=18)
res.set_cookie('first_access', first_access, expires=expires_time) # 在响应头里设置cookie
return res
else: # 不是第一次来
return f"你第一次访问这个网页的时间是: {first_access}"


if __name__ == '__main__':
app.run()

我设置cookie的过期时间是9月7日的18点,但通过浏览器查看cookie信息,显示过期时间是9月8日的凌晨2点,相差了8个小时,这是因为浏览器里会主动加8个小时,想要和我们的北京时间保持一致,在设置的时候就要减去8个小时。

1
expires_time = datetime(year=2021, month=9, day=7, hour=10)

现在的cookie过期时间是9月7日下午18点。