论坛首页 编程语言技术论坛

GAE+bottle+jinja2+beaker快速开发demo

浏览 7994 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-02-25   最后修改:2011-02-25

    相对于Django,bottle可以看成是一个非常精巧的python web framework了,只有一个文件就可以使用了。于是想用这个东西在gae做个简单的demo。

1. GAE+bottle

http://pypi.python.org/pypi/bottle

    copy那个bottle.py到gae工程的目录里,现在,可以写一个很简短的代码来测试一下:

main.py

from bottle import route, default_app
from google.appengine.ext.webapp.util import run_wsgi_app

@route
def index():
    return 'Hello world!'

def main():
    '''Remove this when on production '''
    bottle.debug(True)
    app = default_app()    
    run_wsgi_app(app)
if __name__ == '__main__':
    main()

    同时,要修改app.yaml文件:

handlers:
- url: /.*
  script: main.py

    现在,就可以直接运行GAE,查看结果了!就这么简单!

 

2. GAE+bottle+beaker

    在GAE+bottle的组合中,如果要使用session的话,查询到bottle的原话如下:

How to implement sessions?

There is no build in support for sessions because there is no right way to do it. Depending on requirements and environment you could use beaker middleware with a fitting backend or implement it yourself.

     很清楚的告诉我们,如果要使用session的话,可以考虑beaker,从这里下载:

http://pypi.python.org/pypi/Beaker

     下载下来后,把里面的一个beaker文件夹,copy到GAE工程目录中,会作为一个package来使用。

    在上面的程序修改如下:

main.py

from bottle import route, default_app
from beaker.middleware import SessionMiddleware
from google.appengine.ext.webapp.util import run_wsgi_app

@route('/')
def index():
    session = request.environ['beaker.session']
    if 'refrush_times' in session:
        refrush_times = int(session['refrush_times'])
    else:
        refrush_times = 0
    refrush_times = refrush_times + 1
    session['refrush_times'] = refrush_times
    return 'Hello world! You have refrush this page for %s times.' % str(refrush_times)

def main():
    '''Remove this when on production '''
    bottle.debug(True)
    app = default_app()

    session_opts = {
                    'session.type': 'ext:google',
                    'session.cookie_expires': True,
                    'session.auto': True,
                    }
    app = SessionMiddleware(app, session_opts)
    run_wsgi_app(app)
if __name__ == '__main__':
    main()

    注意,session_opts里的session.type,如果在GAE下使用,一定要选ext:google,这个是我测试了几个选项之后才发现的。如果你有更好的方法,也欢迎告诉我,谢谢。

 

3. GAE+bottle+beaker+jinja2

    因为我之前只用过django的template engine,所以我在这里使用和django template用法差不多的jinja2,下载jiaja2:

http://pypi.python.org/pypi/pip

    把里面的jinja2的目录copy到GAE工程目录。

main.py

from bottle import route, default_app
from beaker.middleware import SessionMiddleware
from google.appengine.ext.webapp.util import run_wsgi_app
from bottle import jinja2_view as view

@route('/')
@view('templates/index.html')
def index():

    session = request.environ['beaker.session']
    if 'refrush_times' in session:
        refrush_times = int(session['refrush_times'])
    else:
        refrush_times = 0
    refrush_times = refrush_times + 1
    session['refrush_times'] = refrush_times
    return {'hello_world_str':'Hello world! You have refrush this page for %s times.' % str(refrush_times)}

def main():
    '''Remove this when on production '''
    bottle.debug(True)
    app = default_app()

    session_opts = {
                    'session.type': 'ext:google',
                    'session.cookie_expires': True,
                    'session.auto': True,
                    }
    app = SessionMiddleware(app, session_opts)
    run_wsgi_app(app)
if __name__ == '__main__':
    main()

接下来需要在GAE工程目录中创建一个templates目录,然后在里面创建一个index.html的模板

template/index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SNS User OAUTH Demo</title>
</head>
<body>
    <p>{{ hello_world_str }}</p>
</body>
</html>

    OK,现在这个DEMO就算完成了。

 

    ps:发现bottle几个不方便的地方:

    1. request没有像django的request有一些对url进行方便操作的方法,这个需要自己去实现,比如django的request.build_absolute_uri(),我是这样去实现的:

    from urlparse import urlparse
    o = urlparse(request.url)
    callback = '%s://%s/%s' % (o.scheme, o.netloc, 'oauth_callback')

    2. 在这种组合下,我还没有发现如何去实现i18n,对于django来说,只需要在locate目录下创建对应语言的资源文件就行了,同时django还提供了makemessages这样的工具,非常方便,而bottle+jinja2我还没有发现如何去实现,也请已经实现了的朋友告诉我如何实现,非常感谢。

    总之,bottle是一个非常精巧的python web框架,对于一些快速的开发demo来说,非常方便,毕竟django里的很多功能是用不上的!

   发表时间:2011-02-26  
beaker 原来可以直接用在GAE上  都怪自己没有知悉“读书”阿
0 请登录后投票
   发表时间:2011-02-28  
ghiewa 写道
beaker 原来可以直接用在GAE上  都怪自己没有知悉“读书”阿


是的,然后我发现在GAE的datastore view里,可以看到一个"beaker_cache"
0 请登录后投票
   发表时间:2011-03-08  
heartsong 写道
ghiewa 写道
beaker 原来可以直接用在GAE上  都怪自己没有知悉“读书”阿


是的,然后我发现在GAE的datastore view里,可以看到一个"beaker_cache"


用上beaker哪就太帅了。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics