Flask 操作 Session

上一个小节我们讲解了如何使用 Flask 框架操作 Cookie,作为和 Cookie 相辅相成的 Session,Flask 框架也对其做了很好的支持,这节课我们就来学习下如何使用 Flask 框架操作 Session。和 Cookie 的操作差不多,对 Session 的操作同样有 设置、获取、删除等等。

1. 程序简介

1.1 程序功能和结构

完成一个 Flask 程序,提供操作 Session 的 4 项功能,如下表所示:

页面路径 功能
/set 在 Session 中存储一个名称为 ‘user’、值为 ‘tom’ 的变量
/get 获取 Session 中名称为 ‘user’ 的变量
/del 删除 Session 中名称为 ‘user’ 的变量
/clear 清除 Session 中所有的变量

程序有 2 个源文件构成:

源文件 描述
app.py Flask 后端程序,提供操作 Session 的接口
templates/query.html 查询 Session 中名称为 ‘user’ 的变量,并返回给客户端

1.2 源程序下载

2. 页面模板 query.html

用户的数据存储在 Session 中,服务端程序使用页面模板 query.html 展示 Session 中的数据,代码如下:

<html>
<head>
<meta charset='UTF-8'>
<title>显示 session 中的变量</title>
</head>

<body>
<h1>显示 session 中的变量</h1>
<h2>session.get('user') = {{ user }}</h2>
</body>

</html>

在 Session 中存储了一个名称为 ‘user’ 的变量,页面模板显示该变量的值。

3. 后端程序 app.py

服务端程序 app.py 提供操作 Session 的功能,程序代码分为如下部分:

3.1 引入模块

#!/usr/bin/python3
from flask import Flask, session, render_template
import os

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)

Flask 程序中有个配置属性叫做 SECRET_KEY,SECRET_KEY 是一个密钥,Flask 以及相关的扩展 extension 需要进行加密时需要使用到这个密钥,使用 Session 存储数据时,Flask 在内部需要进行加密处理。

初始化 Flask 应用对象后,配置 SECRET_KEY。函数 os.urandom (24) 生成一个包含 24 个字符的随机字符串,这个字符串被作为 SECRET_KEY。

3.2 返回给浏览器的内容

def query(): 
    user = session.get('user')
    return render_template('query.html', user = user)

query 函数从 Session 中获取名称为 ‘user’ 的变量,将值作为参数传递给页面模板 query.html,服务端渲染后生成包含有 Session 变量的值内容,返回给浏览器。

Flask 程序对 Sesion 进行设置、修改、删除的操作后,最后调用 query () 函数将 Session 中包含的变量的值返回给浏览器。

注意:可以通过 session [‘user’] 的方法获取名称为 ‘user’ 的变量的值,两者的区别在于

  • 如果变量 user 不存在,session [‘user’] 会抛出异常
  • 如果变量 user 不存在,session.get (‘user’) 返回 None,不会抛出异常

3.3 设置 Session 中的变量

@app.route('/set')
def set():
    session['user'] = 'tom'
    return query()

设置页面路径 /set 的处理函数为 set,函数 set () 在 Session 中设置名称为 ‘user’ 的变量的值为 ‘tom’,最后调用 query () 函数返回 Session 中变量的值给浏览器。

3.4 获取 Session 中的变量

@app.route('/get')
def get():
    return query()

设置页面路径 /get 的处理函数为 get,函数 get 调用函数 query 返回 Session 中变量的值给浏览器。

3.5 删除 Session 中的变量

@app.route('/del')
def delete():
    session.pop('user')
    return query()

设置页面路径 /del 的处理函数为 del,函数 del 使用 session.pop (‘user’) 在 Session 中删除名称为 ‘user’ 的变量,最后调用函数 query 返回 Session 中变量的值给浏览器。

3.6 清空 Session 中全部的变量

@app.route('/clear')
def clear():
    session.clear()
    return query()

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

设置页面路径 /set 的处理函数为 clear,函数 clear 使用 session.clear () 删除 Session 中所有的变量,最后调用函数 query 返回 Session 中变量的值给浏览器。

4. 运行程序

1. 在浏览器器中输入 http://localhost:5000/get,显示如下:

图片描述

初始化的状态下,Session 为空,因此变量 user 的值为空。

2. 在浏览器器中输入 http://localhost:5000/set,显示如下:

图片描述

在页面 /set 的处理函数中,设置 Session 中名称为 ‘user’ 的变量值为 ‘tom’,设置成功后,显示名称为 ‘user’ 的变量的值为 ‘tom’。

3. 在浏览器器中输入 http://localhost:5000/del,显示如下:

图片描述

在页面 /del 的处理函数中,删除 Session 中名称为 ‘user’ 的变量,删除后,显示名称为 ‘user’ 的变量的值为空。

4. 在浏览器器中输入 http://localhost:5000/clear,显示如下:

图片描述

在页面 /clear 的处理函数中,删除 Session 中所有的变量,删除后,显示名称为 ‘user’ 的变量的值为空。

5. 小结

本节讲解在 Flask 中如何操作 Session,使用思维导图概括如下:

图片描述