Flask状态保持Cookie和Session

63 阅读4分钟

状态保持

Cookie

Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookiekey/value保存到某个目录下的文本文件内,下次请求同一网站时自动发送该Cookie给服务器

Cookie可以用来在某个WEB站点会话间持久的保持状态


由于HTTP是一种无状态的协议,服务器单从网络连接上无法记录和判断多次访问的用户状态

就好比你开了个奶茶店🥤,有顾客买了个奶茶走了,下一次再来买,你怎么知道这个顾客是你的老顾客,好好招待他呢?🤔️

解决办法很简单,就是办个会员卡💳,卡上记录着她的余额等信息,这个会员💳就好比是Cookie,当顾客拿着这张会员卡💳下次再进店购买时,就可以证明他是个老顾客,浏览器经常会充当持有Cookie的角色,Cookie会被自动携带至头部请求服务器

但是这里也暴露出来了一个问题,给顾客会员卡💳,顾客可以直接在他手里修改,或者被别人盗用模仿,好比就像是Cookie放入客户端浏览器

由于Cookie是放入了客户端浏览器,客户端可以有机会和权限修改Cookie,或者被别人模仿伪造盗用,所以Cookie不安全


设置cookie

设置cookie,默认有效期是临时cookie,浏览器关闭就失效

可以通过 max_age 设置有效期, 单位是秒

response = make_response("set cookie")  # 设置响应体
response.set_cookie("k", "v", max_age=3600) # # 1小时过期

获取cookie

获取cookie,通过reques.cookies的方式, 返回的是一个字典,可以获取字典里的相应的值

cookie = request.cookies.get("k")

删除cookie

这里的删除只是让cookie过期,并不是直接删除cookie

删除cookie,通过**delete_cookie()**的方式, 里面是cookie的名字

response = make_response("del success") 
response.delete_cookie("k") # 删除cookie

当这段代码运行时,其实是设置了cookie中的k对应的值为空,并且过期时间设置到了1970年,这很明显已经过期了

Set-Cookie: k=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/

设置cookie有效时间

cookie的过期时间主要通过response.set_cookie方法的参数来指定

response = make_response("set cookie expire") 
response.set_cookie("k", "v", max_age=None, expires=None,)
  • max_age

    距离现在多少秒后过期,在IE8以下不支持

  • expires

    datatime类型,使用此参数,需参照格林尼治时间,即北京时间-8个小时

如果max_age和expires都设置了,则以max_age为参准,若没有设置过期时间,则默认为浏览会话结束,即关闭浏览器时过期

response.set_cookie("name","value",max_age=60) # 60s过期
expires = datetime(year=2020,month=2,day=2,hour=0,minute=0,second=0)
response.set_cookie("name", "value", expires=expires)

Session

flask的session基于cookie,但是是用密钥签名加密的cookie,虽然用户可以查看你的cookie ,但没有密钥,也就无法修改它,保证了session的安全

flask的seesion默认存储方案是浏览器,当然也可以设置到其他数据库中,我们未来再谈

使用session,首先要设置对应session进行签名加密的密钥,这个密钥可以自定义,也可以通过python来生成

from flask import Flask

app = Flask(__name__)
app.secret_key = "ZegeNB" # 自定义
app.config['SECRET_KEY'] = os.urandom(24) # 随机生成

操作session和cookie类似,就像在轻松愉快的玩耍一个字典一样

设置session

from flask import Flask, session
...
session["k"] = "v" # 这就是设置session
return ...
# session=eyJrIjoidiJ9.YBVjQA.nht4OJ2QYsHaU41D0nJdnBSZjsI;
# session=eyJrIjoidiJ9.YBVjTQ.38oRRQhdOEtrbbGryVBwtFxmd4M; 

获取session

因为session就像字典一样所以,操作它的时候有两种方法

dict["k"] # 获取不到k值报错
dict.get("k") # 获取不到k值返回None

一般推荐使用第二种获取方式,没有也不报错,比较友好

删除session

和删除字典里的一个key一样

session.pop['k'] # 删除并返回
del session["k"] # 删除不返回

如果session中只有最后一个,那么将和cookie的删除策略一致,设置了session中的k对应的值为空,并且过期时间设置到了1970年,这很明显已经过期了

Set-Cookie: session=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/

设置session有效时间

  • 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束

  • 如果设置了session的permanent属性为True,那么过期时间是31天。

@app.route('/index')
def index():
    session["k"] = "v"
    session.permanent = True  # 长期有效,一个月的时间有效
    return "SET session"
  • 可以通过给app.config设置PERMANENT_SESSION_LIFETIME来更改过期时间,这个值的数据类型是datetime.timedelay类型
from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效