首页 > 代码库 > 完整解决webpy框架在SAE上的文件方式保存session问题
完整解决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已经可以正常使用了.
editer by zdl0812@163.com 欢迎转载,请注明出处
完整解决webpy框架在SAE上的文件方式保存session问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。