IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    web.py在google app engine上的注意事项

    longhao (longtask@gmail.com)发表于 2011-05-21 09:15:07
    love 0

        web.py 是python的一款web开发框架,小巧,简单,实用。写简单的web页面,web.py可以快速的完成,你只需了解它的MTV(model,template,view)工作模式就好了。gae中默认是支持django的,这个框架开发效率很好,对我们有些小应用来说还是太重了。所以webpy是个不错的选择。

        由于web.py自带的模板用起来并不是很爽,可以选择mako作为开发模板。把web.py和mako的包放到工程中,关于web.py的具体工作内容可以参考官方的文档,有需要的时候查看一下即可。在结合gae开发的过程中会碰到的问题做一些探讨。

         Session的存储

        由于web.py支持文件和数据库存储,gae不支持本地文件存储session,所以只能找到他的memcache作为session的存储地,所以需要重写web.session中的Store类来达到在gae中存储session的目的。

    from web.session import Store
    import web
    import time

    class MemcacheStore(Store):
        def __init__(self, memcache):
            self.memcache = memcache
          
        def __contains__(self, key): 
            data = self.memcache.get(key) 
            return bool(data)  
      
        def __getitem__(self, key): 
            now = time.time() 
            value = self.memcache.get(key)
            if not value: 
                raise KeyError 
            else: 
                value['attime'] = now
                self.memcache.replace(key,value)
                return value 
      
        def __setitem__(self, key, value): 
            now = time.time()
            value['attime'] = now
            s = self.memcache.get(key)
            if s: 
                #value = dict(map(lambda x: (str(x[0]), x[1]), [(k, v) for (k, v) in value.iteritems() if k not in ['_id']])) 
                self.memcache.replace(key,value)
            else: 
                self.memcache.add(key,value,int(web.config.session_parameters['timeout'][0])) 
                      
        def __delitem__(self, key): 
            self.memcache.delete(key) 
      
        def cleanup(self, timeout): 
            #timeout = timeout / (24.0 * 60 * 60)
            #last_allowed_time = time.time() - timeout 
            #self.collection.remove({'attime' : { '$lt' : last_allowed_time}}) 
            #automatic cleanup the session
            #self.memcache.flush_all()
            pass

         模板的生成

        web.py templetor 把模板编译成 python 字节码,这需要访问标准库中的 parser 模块。不幸的是,由于安全原因 GAE 禁用了这个模块。

        为了克服这个状况,web.py 支持把模板编译成 python 代码,从而避免在 GAE 上使用原来的模板。web.py 确保在应用这种方法的时候模板中的代码不需要任何改变。

        为了编译一个文件夹中所有的模板(一旦有模板改动,就需要重新运行),运行:

        $ python web/template.py --compile templates

        以上命令把 templates/ 目录下的模板文件递归地全部编译,并且生产 __init__.py, 'web.template.render` 重新编写过,它将视 templates 为一个 python 模块。

         配置的问题

        由于web.py的静态文件需要放在根目录的static下面,所以需要在yaml配置中对css,js,images做相关的配置处理,否则gae无法通过web.py来正确的解析相关的配置。

    - url: /css
      mime_type: text/css
      expiration: 10000d
      static_dir: static/css
    - url: /images
      expiration: 10000d
      static_dir: static/images
    - url: /js
      static_dir: static/js
      expiration: 10000d



沪ICP备19023445号-2号
友情链接