完整解決webpy框架在SAE上的文件方式保存session問題
來源:程序員人生 發布時間:2015-01-09 08:07:07 閱讀次數:2850次
1,解決官方sae樣例代碼中的誤區
#app = web.application(urls, globals()).wsgifunc()
app = web.application(urls, globals())
#application = sae.create_wsgi_app(app)
application = sae.create_wsgi_app(app.wsgifunc())
注釋掉代碼為官方提供的樣例代碼,但官方代碼為了方便在APP實例化時直接調用了wsgifunc(),但這樣會造成部份webpy屬性的調用毛病.如調用app.add_processor的失敗.
2,設定全局session的調用
#增加session管理,將session放入全局的web.config
if web.config.get('_session') is None:
shop_session = web.session.Session(app, DiskStore(session_root),
initializer={'login_shop_id':'NULL'})
web.config._session = shop_session
else:
shop_session = web.config._session
def session_hook():
web.ctx.session = shop_session
app.add_processor(web.loadhook(session_hook))
3,解決sae環境中沒法讀寫本地目錄問題
SAE環境下python沒法對本地目錄進行讀寫操作,但sae提供了Storage,并且可以將Storage像本地磁盤1樣掛載使用.所以添加以下代碼:
monkey.patch_all()
session_root = '/s/session/'
注意:需要提早在sae中啟用Storage,且添加"
domain:session"以便具有權限.
4,解決SEA的Storage作為磁盤掛載后但不支持os.remove方法
"目前支持(patch)的文件系統接口函數為: open,
os.listdir, os.mkdir, os.path.exists, os.path.isdir, os.open, os.fdopen, os.close, os.chmod, os.stat, os.unlink, os.rmdir"但webpy在DiskStore.cleanup方法卻是調用的os.remove,需要改成os.unlink
#因新浪SAE的stroge不支持掛載為路徑后的os.remove函數,故重新改在1下
class DiskStore(web.session.DiskStore):
def __init__(self, root):
web.session.DiskStore.__init__(self, root)
# if the storage root doesn't exists, create it.
self.root = root
def cleanup(self, timeout):
now = time.time()
for f in os.listdir(self.root):
path = self._get_path(f)
atime = os.stat(path).st_atime
if now - atime > timeout :
os.unlink(path)#改寫為unlink函數
OK,現在session已可以正常使用了.
editer by zdl0812@163.com 歡迎轉載,請注明出處
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈