在网站中,http请求是无状态的。也是就是说第一次和服务器连接后并且登录成功后,第二次请求服务器,服务器依然不能知道当前请求是哪一个用户。cookie的出现就是为了解决这个问题,第一次登录服务器返回一些数据(cookie)给浏览器,然后浏览器保存到本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪一个了。cookie存储的数据量是有限的,不同的浏览器有不同的存储大小,但是一般不会超过4KB。因此使用cookie只能存储一些小量的数据。
session和cookie的作用有点类似,都是存储用户的相关信息,不同的是:cookie是存储在本地浏览器,而session存储在服务器,存储在服务器的数据会更加安全,不容易被窃取。但是,存储在服务器也有一定的弊端,会占用服务器资源,但现在服务器已经发展至今,存一些seesion信息还是绰绰有余的!!!
使用seesion优点:
****** 敏感数据不是直接发送会浏览器,而是发回一个 ‘ session_id ’,服务器将 ‘ session_id ’ 和敏感词数据做一个映射,存在 ‘ sesson’ (服务器上边)中,更加安全。
****** ‘ session ’ 可以设置过期时间,也从另一方面保障了用户账号的安全。
web开发至今,cookie和session的使用已经出现了一些非常成熟的方案,在如今的企业里,一般有两种存储方式:
(1)存储在服务端:
通过在cookie存储一个seesion_id,然后具体的数据则是保存在seesion中。也就是说:如果用户已经登录,则服务器会在cookie中保存一个session_id,下一次再次请求的时候,会携带seesion_id,服务器会根据seesion_id在seeson库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫:server side session。
(2)将sesson数据加密,然后存储在cookie中。这种专业术语叫:client side session 。flask采用的是就是这种方式,但是也可以替换成其他形式。
flask中的session机制是:
(1)把敏感数据经过加密后放入‘session中’,然后再把‘session’存放到 cookie 中,下次请求的时候,再从浏览器发送过来的‘ cookie ’中读取 ‘ sesson ’,然后再从‘session’中读取敏感数据,并进行解密,获取最终的数据。
(2)flask的这种‘session’机制,可以节省服务器开销,因为把所有的信息存到了客户端(浏览器)。
在flask中,session是通过from flask import session ;然后添加key和value进去即可。并且,flask中的session机制,是将session信息加密,然后存储在cookie中。
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/')
def fn():
session['username'] = 'lxc'
return 'success'
上边代码,session[ 'key' ] = value ,即可把一个值设置在session里边去;前提需要设置‘secret_key’,而且这个值必须是24字符串才行,上边代码我们用到os模块中的urandom方法:可随机 产生n个字节的字符串。(最后会说下随机性的弊端!!!)
输入:http://127.0.0.1:5000 在cookie中会看到如下结果:(数据已经设置到session中去,而session它会自动设置到cookie中去)
@app.route('/get')
def fn1():
session_info = session.get('username')
print(session_info) # 'lxc'
return 'success'
上边代码,在输入:http://127.0.0.1:5000/get时,会输出 session中的数据
删除session中的值,相当于调用字典方法:下边2种方法都可以删除字典中的value
@app.route('/delete')
def dele():
session.pop('username') # 方法一:删除session中指定的值
session.clear() # 方法二:删除session中全部的值
return '删除成功'
输入http://127.0.0.1:5000/delete时,cookie中session中的数据会被删除!
开始我们把数据存入seesion中,接着重启服务器,使用get方法取session中的数据时,结果是:None
原因是:由于SECRET_KEY在每次服务器重启其后,都会改变,所以取session中的数据时,根据之前的secret_key进行解密会失败。。。
需要配置session的过期时间:
app.config[ 'PERMANENT_SESSION_LIFETIME' ] = timedelta( days=7 )
session.permanent = True
from flask import Flask,session
from detetime import timedelte
app = Flask(__name__)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=2)
@app.route('/add')
def fn():
session['username'] = '吕星辰'
session.permanent = True
return 'lxc'
上边代码,引入detetime模块,需要配置app.config[ 'PERMANENT_SESSION_LIFETIME' ] = timedelta( days=2 ),设置过期时间为2天,在视图函数中,设置session.permanent = True,即可完成session的过期时间: