一、Session 基础概念
除请求对象外,Flask 提供 session 对象,用于在多次请求之间保存单个用户的专属信息。
- 底层基于 Cookie 实现;
- Cookie 会进行密钥签名;
- 用户可以查看 Cookie 里的数据内容,无法随意篡改,除非拿到服务端签名密钥。
使用前提:必须配置密钥 app.secret_key,否则 session 无法正常工作。
二、核心语法
- 设置密钥
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'Code language: JavaScript (javascript)
- 写入session(登录保存用户)
# 存储数据,类似字典赋值
session['username'] = request.form['username']Code language: PHP (php)
- 读取session
username = session.get('username')Code language: JavaScript (javascript)
- 删除session数据(登出)
# pop(key, None):键存在则删除,不存在不会报错
session.pop('username', None)Code language: PHP (php)
实例包括(登录 + 首页 + 登出)
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
# 配置密钥,开启session签名
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
# 首页:展示当前登录用户
@app.route('/')
def index():
username = session.get('username')
if username:
return f"当前登录用户是:{username}"
return "未登录"
# 登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 将用户名存入session
session['username'] = request.form['username']
return redirect(url_for('index'))
# GET请求返回登录表单
return '''
<form action="" method="post">
<p>用户名: <input type=text name=username>
<p><input type=submit value=登录>
</form>
'''
# 登出页面
@app.route('/logout')
def logout():
# 移除session中的用户名
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)Code language: Python (python)
执行流程
- 用户访问
/login,填写用户名提交表单(POST); - 服务端把用户名写入
session['username']; - Flask 将会话数据加密签名后存入浏览器 Cookie;
- 跳转首页
/,读取 session 展示登录用户; - 用户访问
/logout,清除 session 内用户名,回到未登录状态。
注意
- Flask 默认session数据全部存放在客户端Cookie,不适合存放大量、敏感隐私数据;
secret_key生产环境不要硬编码写在代码中,建议从环境变量读取;- 不要直接使用
del session['key'],键不存在时会抛出异常,优先使用session.pop(key, None)。
Previous: Response 响应
Next: 日志记录