目录
Flask session概念:
程序可以把数据存储在用户会话中,用户会话是“私有存储”,默认情况下session会保存在客户端的cookie中。
session是基于cookie实现,保存在服务端的键值对(形式为:{加密字符串:"data"}),同时在浏览器中保存了这个“加密字符串”用来再此请求的时候验证。
因此使用session时要设置一个密钥(加密字符串):“app.secret_key”
session密钥的设置
给session设置密钥一般来说有三种方法:
- 手动指定session密钥,例如我想要这个密钥是“abcd”,那么可以写下如下代码:app.secret = abcd,该方法风险性高,优点是便于调试
- 使用“app.secret = secrets.token_hex(16)”生成随机的十六进制字符串作为密钥
- 使用“app.secret = os.urandom(24)”生成随机的二进制字符串作为密钥
在这里我们推荐使用第二种和第三种,并且定期更新密钥,防止数据泄露
测试代码
在这里,我们创建了一个简单的前端页面,并且添加了三个按钮,方便为下面的功能做说明
点击“添加session”按钮,服务端会创建一个:“session["test"] = this is test”的session
点击“获取session”按钮,服务端会返回session的值,前端用console.log()打印出这个值
点击“删除session”按钮,服务端会删除所有session
为方便大家测试,作者将HTML代码和Flask代码贴出,方便大家测试:
HTML
<!doctype html>
<html>
<head>
<title>测试</title>
<script src="/static/JavaScript/jquery-3.7.1.min.js"></script>
</head>
<body>
<button onclick="addSession()">添加session</button>
<button onclick="getSession()">获取session</button>
<button onclick="deleteSession()">删除session</button>
<script>
function addSession(){
$.ajax({
url:"/add",
type:"post",
contentType:"application/json",
data:JSON.stringify({
type:"test",
content:"this is test"
})
})
}
function getSession(){
$.ajax({
url:"/get",
type:"get",
success:function(res){
console.log(res);
}
})
}
function deleteSession(){
$.ajax({
url:"/delete",
type:"get"
})
}
</script>
</body>
</html>
Flask
from flask import *
from os import urandom
app = Flask(__name__)
app.secret_key = urandom(24)
@app.route("/")
def main():
return render_template("ceshi.html")
@app.route("/add",methods=["POST"])
def add():
data = request.get_json()
key = data["type"]
value = data["content"]
session[key] = value
return "success"
@app.route("/get")
def get():
return session.get("test")
@app.route("/delete")
def delete():
session.clear()
return "success"
if __name__ == "__main__":
app.run(debug=True)
Falask session添加
添加session,可以直接使用:“session[key] = value”的形式添加
Flask session获取
操作session就像操作Python中的字典一样,我们可以使用session[key"]获取值,也可以使用session.get("key")获取值
- value = session["key"]:如果“key”不存在,将会抛出异常
- value = session.get("key"):如果“key”不存在,将返回None(推荐使用)
Flask session删除
- 删除全部session:“session.clear()”
- 删除某个session:“session.pop(ky)
执行结果
添加session再获取session后:
删除session再获取session后:
Flask session安全性问题
只是单纯设计密钥,并不足应对所有的安全问题,由于Flask框架自身的问题,cookie在客户端是可读的,这也就造成session可能会被破解,因此我们需要进一步提升session安全,在这里,作者给出一种通用的方法:
- 首先pip安装“falsk_session”
安装方法:
pip install flask_session
添加如下代码:
from flask import *
from flask_session import Session
from os import urandom
app = Flask(__name__)
app.secret_key = urandom(24)
app.config["SESSION_TYPE"] = 'filesystem'
Session(app)
这样session在客户端就会不可读,并且session是动态变化的,大大提高了安全性