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

解決 web.py 在 SAE 平台上的 Session 儲存問題(使用 MySQL)

     編輯:更多程式設計知識

在 SAE(Sina App Engine)上使用 web.py 開發應用時,預設的 Session 機制依賴本地文件儲存,但 SAE 的沙箱環境限制了文件寫入權限,導致 Session 無法正常工作。本文提供一個完整的解決方案:將 Session 數據存儲在 MySQL 數據庫中,並附帶詳細的代碼實現與註釋,幫助開發者快速解決該問題。

核心思路

web.py 內建的 web.session.DBStore 支持將 Session 數據寫入資料庫。只需在應用啟動時初始化資料庫連接,並將 DBStore 實例傳給 web.session.Session,即可實現 Session 的持久化與跨請求共享。

完整代碼實現

1. 入口文件 index.wsgi

#!/usr/bin/env python
# coding: utf-8
import os
import web
import sae
from config.url import urls
from config import settings

# 關閉調試模式
web.config.debug = False

# 創建應用實例
app = web.application(urls, globals())

# 從配置獲取數據庫連接
db = settings.db

# 使用 DBStore 將 session 存入名為 'sessions' 的表
store = web.session.DBStore(db, 'sessions')

# 初始化 Session,可選 initializer 設定預設值
session = web.session.Session(app, store)

# 將 session 掛載到 web.config 供全局訪問
web.config._session = session

# 包裝為 SAE 所需的 WSGI 應用
application = sae.create_wsgi_app(app.wsgifunc())

2. 路由配置 config/url.py

#!/usr/bin/env python
# coding: utf-8

pre_fix = 'controllers.'

urls = (
    '/', pre_fix + 'todo.Index',
    '/todo/new', pre_fix + 'todo.New',
    '/todo/(\d+)', pre_fix + 'todo.View',
    '/todo/(\d+)/edit', pre_fix + 'todo.Edit',
    '/todo/(\d+)/delete', pre_fix + 'todo.Delete',
    '/todo/(\d+)/finish', pre_fix + 'todo.Finish',
    '/todo/login', pre_fix + 'login.LoginUser',
    '/todo/checkuser', pre_fix + 'login.CheckUser',
    '/todo/reset', pre_fix + 'todo.reset',
    '/todo/saveupload', 'mycontrollers.saveupload.SaveUpload'
)

3. 設定文件 config/settings.py

#!/usr/bin/env python
# coding: utf-8
import web
import sae.const

# 使用 SAE 環境變量自動配置 MySQL 連接
db = web.database(
    dbn='mysql',
    user=sae.const.MYSQL_USER,
    pw=sae.const.MYSQL_PASS,
    host=sae.const.MYSQL_HOST,
    port=3307,
    db=sae.const.MYSQL_DB
)

# 模板渲染器
render = web.template.render('templates/', cache=False)

config = web.storage(
    email='your@email.com',
    site_name='任務追蹤',
    site_desc='',
    static='/static',
)

web.template.Template.globals['config'] = config
web.template.Template.globals['render'] = render

4. 登入控制器 controllers/login.py

#!/usr/bin/env python
# coding: utf-8
import web
from config import settings

render = settings.render

def myloadhook():
    """將全局 session 變量引入當前作用域"""
    global session
    session = web.config._session

class LoginUser:
    def GET(self):
        return render.LoginUser()

class CheckUser:
    def POST(self):
        myloadhook()
        i = web.input()
        username = i.get('txtUserName', None)
        password = i.get('txtUserPass', None)

        session = web.config._session
        if username == 'chu888' and password == 'chu888':
            session.access_token = 'true'
            raise web.seeother('/')
        else:
            session.access_token = 'false'
            raise web.seeother('/todo/login')

關鍵點說明

  • 資料庫表自動建立:DBStore 首次運行時會自動創建 sessions 表,無需手動建表。
  • 全局共享:將 session 掛載到 web.config._session,在任何控制器中均可通過 web.config._session 讀寫數據。
  • SAE 環境適配:使用 sae.const 獲取數據庫憑證,避免硬編碼敏感信息。

常見問題排查

  1. 若 Session 仍失效,檢查 settings.py 中數據庫連接參數是否正確。
  2. 確保 MySQL 服務已在 SAE 控制台開啟並授權。
  3. 查看 SAE 日誌確認是否有權限或連接錯誤。

通過上述方案,即可在 SAE 上穩定運行 web.py 應用的 Session 功能,適合中小型項目快速部署。

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