状态保持
Cookie
Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/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以下不支持
-
expiresdatatime类型,使用此参数,需参照格林尼治时间,即北京时间-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天有效