Bottle 單文件、輕量級設計雖優雅,但內置僅支持 Cookie,缺乏 Session 機制。為安全考慮(避免敏感數據暴露於客戶端),需引入服務端 Session。本文演示使用 Beaker 中間件 為 Bottle 無縫添加文件存儲 Session 支持。
pip install beaker
# 或 easy_install beaker
# Windows 若提示命令不存在,請將 Python/Scripts 目錄加入 PATH
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bottle import route, default_app, run, request
from beaker.middleware import SessionMiddleware
# Session 配置:文件存儲、300秒過期、自動創建
session_opts = {
'session.type': 'file',
'session.cookie_expires': 300,
'session.data_dir': './sessions',
'session.auto': True
}
@route('/test')
def test():
# 從 WSGI 環境獲取 Beaker Session 對象
session = request.environ.get('beaker.session')
# 讀取/寫入計數器
session['test'] = session.get('test', 0) + 1
session.save() # 显式保存(auto=True 時可省略)
return 'Test counter: %d' % session['test']
# 構建 WSGI 應用:Bottle app 包裹在 SessionMiddleware 中
app = default_app()
app = SessionMiddleware(app, session_opts)
if __name__ == '__main__':
run(app=app, host='127.0.0.1', port=8080, reloader=True)
Listening on https://127.0.0.1:8080/https://127.0.0.1:8080/testTest counter: 1 → 2 → 3…request.environ.get('beaker.session') 是標準 WSGI 方式,非 Bottle 原生 API。session.save() 將變更寫入存儲後端(文件目錄 ./sessions)。SessionMiddleware 必須包裹在 Bottle app 外層,確保請求先經過 Session 初始化。session.type 改為 memcached 或 redis,配置 session.url 指向集群存儲,避免單點文件 I/O 瓶頸。# Memcached
session_opts = {
'session.type': 'memcached',
'session.url': '127.0.0.1:11211',
'session.cookie_expires': 3600,
'session.auto': True
}
# Redis (需 beaker_extensions.redis 支持)
session_opts = {
'session.type': 'ext:redis',
'session.url': 'redis://127.0.0.1:6379/0',
'session.cookie_expires': 3600,
'session.auto': True
}
Beaker 以中間件形式為 Bottle 注入企業級 Session 能力,配置靈活、存儲可插拔,是輕量框架擴展的最佳實踐。開發者可專注業務邏輯,無需重造輪子。