设为首页 加入收藏

TOP

完整解决webpy框架在SAE上的文件方式保存session问题
2015-02-02 14:27:07 来源: 作者: 【 】 浏览:9
Tags:完整 解决 webpy 框架 SAE 文件 方式 保存 session 问题

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像本地磁盘一样挂载使用.所以添加如下代码:


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函数,故重新改在一下
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已经可以正常使用了.


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C程序内存管理 下一篇Hadoop二次排序的其他写法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: