【笔记】Flask 用 session 对象存储用户状态

Flask 的 session 对象实际上是把数据加密后存储在客户端的 Cookie 中(名为 session)。只要客户端每次请求都携带这个 Cookie,服务端就能还原出会话数据。

复制代码
from flask import Flask, session, request, jsonify

app = Flask(__name__)
# 必须设置 secret_key,用于对 session cookie 签名,防止篡改
app.secret_key = 'super-secret-key-change-me'

@app.route('/login', methods=['POST'])
def login():
    """登录接口:接收 username,写入 session"""
    username = request.form.get('username')
    if not username:
        return jsonify({'error': 'username is required'}), 400

    session['user'] = username
    session['visit_count'] = 0          # 初始化访问计数器
    return jsonify({'message': f'Login successful, welcome {username}'})

@app.route('/logout', methods=['POST'])
def logout():
    """登出接口:清除 session 中的 user"""
    session.pop('user', None)
    return jsonify({'message': 'Logged out'})

@app.route('/profile', methods=['GET'])
def profile():
    """查看登录状态"""
    user = session.get('user')
    if user:
        return jsonify({'user': user, 'status': 'logged in'})
    return jsonify({'message': 'Not logged in'}), 401

@app.route('/data', methods=['GET'])
def get_data():
    """需要登录才能访问的数据,并记录访问次数"""
    if 'user' not in session:
        return jsonify({'message': 'Unauthorized'}), 401

    session['visit_count'] += 1
    return jsonify({
        'data': 'This is protected data',
        'visit_count': session['visit_count']
    })

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

import requests

# 创建一个会话对象,它会自动管理 Cookies 和连接池
s = requests.Session()

BASE_URL = 'http://127.0.0.1:5000'

print('=== 1. 未登录,直接访问 profile ===')
resp = s.get(f'{BASE_URL}/profile')
print(f'Status: {resp.status_code}, Body: {resp.json()}')

print('\n=== 2. 发送 POST 请求登录 ===')
resp = s.post(f'{BASE_URL}/login', data={'username': 'Alice'})
print(f'Status: {resp.status_code}, Body: {resp.json()}')

print('\n=== 3. 登录后再次访问 profile ===')
resp = s.get(f'{BASE_URL}/profile')
print(f'Status: {resp.status_code}, Body: {resp.json()}')

print('\n=== 4. 多次访问 /data,观察计数器 ===')
for i in range(3):
    resp = s.get(f'{BASE_URL}/data')
    print(f'第{i+1}次访问: {resp.json()}')

print('\n=== 5. 登出 ===')
resp = s.post(f'{BASE_URL}/logout')
print(f'Status: {resp.status_code}, Body: {resp.json()}')

print('\n=== 6. 登出后再访问 profile ===')
resp = s.get(f'{BASE_URL}/profile')
print(f'Status: {resp.status_code}, Body: {resp.json()}')

# 查看当前 Session 中保存的 Cookies
print('\n=== 当前 Session 中的 Cookies ===')
print(s.cookies.get_dict())

Flask Session 的特点

  • 存储位置在 客户端 Cookie ,服务端通过 secret_key 签名保证数据不被篡改。

  • 如果不希望暴露数据到客户端,可以使用 Flask-Session 扩展将 Session 存到 Redis 等服务器端。

requests.Session 做了什么

  • 自动管理 Cookie :第一次请求收到 Set-Cookie 后,后续请求都会自动带上 Cookie 头,无需手动处理。

  • 连接复用 :底层 urllib3 会维护连接池,对同一主机的多次请求会复用 TCP 连接,减少三次握手开销(可抓包验证)。

  • 保持其他参数:同一个 Session 可以统一设置 headers、auth 等,对所有请求生效。

相关推荐
商业白皮书19 分钟前
2026年上海豆包DeepSeekKimi百度AI通义千问GEO服务商选择
人工智能·笔记
存在morning23 分钟前
【OLAP 学习笔记】Doris:数据湖之上的分析查询引擎
笔记·学习
深圳老胡1 小时前
STM32F4 OTA升级:单App与双App方案优缺点对比
笔记·stm32·单片机·代码规范
yi01110 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
志尊宝11 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
weixin_4481199413 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
要开心吖ZSH13 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
咖啡忍者14 小时前
【SAP】程制造生产计划PP-PI(Production Planning for Process Industries)
笔记
Titan202415 小时前
MySQL索引学习笔记
笔记·学习·mysql
zhangrelay16 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件