首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Bottle 框架整合 Beaker 實現 Session 支持

     編輯:更多程式設計知識

Bottle 單文件、輕量級設計雖優雅,但內置僅支持 Cookie,缺乏 Session 機制。為安全考慮(避免敏感數據暴露於客戶端),需引入服務端 Session。本文演示使用 Beaker 中間件 為 Bottle 無縫添加文件存儲 Session 支持。

為什麼選擇 Beaker?

  • 成熟穩定的 WSGI 中間件,支持多種存儲後端:文件、內存、Memcached、Redis、資料庫等。
  • 通過中間件模式零侵入式接入,不修改 Bottle 核心代碼。
  • 配置簡單,開箱即用。

安裝 Beaker

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)

運行與驗證

  1. 執行腳本,控制台輸出:Listening on https://127.0.0.1:8080/
  2. 瀏覽器訪問 https://127.0.0.1:8080/test
  3. 反覆刷新,頁面顯示計數器遞增:Test counter: 1 → 2 → 3…
  4. 關閉瀏覽器重新打開,計數器歸零(Cookie 過期),驗證 Session 隔離性。

關鍵點解析

  • Session 獲取: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 能力,配置靈活、存儲可插拔,是輕量框架擴展的最佳實踐。開發者可專注業務邏輯,無需重造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved