Session 会话

一、Session 基础概念

除请求对象外,Flask 提供 session 对象,用于在多次请求之间保存单个用户的专属信息

  • 底层基于 Cookie 实现;
  • Cookie 会进行密钥签名;
  • 用户可以查看 Cookie 里的数据内容,无法随意篡改,除非拿到服务端签名密钥。

使用前提:必须配置密钥 app.secret_key,否则 session 无法正常工作。

二、核心语法

  1. 设置密钥
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'Code language: JavaScript (javascript)
  1. 写入session(登录保存用户)
# 存储数据,类似字典赋值
session['username'] = request.form['username']Code language: PHP (php)
  1. 读取session
username = session.get('username')Code language: JavaScript (javascript)
  1. 删除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)

执行流程

  1. 用户访问 /login,填写用户名提交表单(POST);
  2. 服务端把用户名写入 session['username']
  3. Flask 将会话数据加密签名后存入浏览器 Cookie;
  4. 跳转首页 /,读取 session 展示登录用户;
  5. 用户访问 /logout,清除 session 内用户名,回到未登录状态。

注意

  1. Flask 默认session数据全部存放在客户端Cookie,不适合存放大量、敏感隐私数据;
  2. secret_key 生产环境不要硬编码写在代码中,建议从环境变量读取;
  3. 不要直接使用 del session['key'],键不存在时会抛出异常,优先使用 session.pop(key, None)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注