3

我正在使用 webapp2 指南 ( http://webapp-improved.appspot.com/guide/handlers.html )中描述的 webapp2 微框架:

import webapp2

class WSGIApplication(webapp2.WSGIApplication):
    def __init__(self, *args, **kwargs):
        super(WSGIApplication, self).__init__(*args, **kwargs)
        self.router.set_dispatcher(self.__class__.custom_dispatcher)

    @staticmethod
    def custom_dispatcher(router, request, response):
        rv = router.default_dispatcher(request, response)
        if isinstance(rv, basestring):
            rv = webapp2.Response(rv)
        elif isinstance(rv, tuple):
            rv = webapp2.Response(*rv)
        return rv

    def route(self, *args, **kwargs):
        def wrapper(func):
            self.router.add(webapp2.Route(handler=func, *args, **kwargs))
            return func
        return wrapper

然后我定义我的视图函数:

import micro_webapp2

app = micro_webapp2.WSGIApplication()

@app.route('/')
def hello_handler(request, *args, **kwargs):
    return 'Hello, world!'

相反,我想呈现模板、调用重定向并使用 webapp2 会话扩展。

使用 webapp2 微框架时应该怎么做?

4

3 回答 3

4

回复:模板

看起来 webapp2 似乎没有内置模板引擎。然而,有很多非常高质量的 Python 模板系统。一些最受欢迎的包括jinja2django-templatesPystache

如果您计划部署到谷歌应用引擎,您可能需要选择 Django 模板或 Jinja2,因为它们都支持开箱即用

我推荐 jinja2,因为它很容易上手,有很好的文档,而且效果很好(虽然我以前用过 django 和 Pystache,两者都很棒)。

Jinja2 有一个入门指南,可以帮助您快速入门。一旦你安装了 Jinja2,使用它应该只是制作一个适当的“模板”目录,其中包含一个模板。说'hello.html':

<!doctype html>
<html><head><title>Hello {{ who }}</title></head>
<body><h1>Hello {{ who }}</h1></body>
</html>

并使您的视图看起来像:

import micro_webapp2
from jinja2 import Environment, PackageLoader

app = micro_webapp2.WSGIApplication()
env = Environment(loader=PackageLoader('my_application_name', 'templates'))

@app.route('/')
def hello_handler(request, *args, **kwargs):
    template = env.get_template('hello.html')
    return template.render(who='world')

我希望这是有帮助的,

于 2013-03-28T09:29:22.800 回答
1

我现在正在使用这个微框架:

import webapp2

from webapp2_extras import jinja2, routes, sessions

class WSGIApplication(webapp2.WSGIApplication):

    def __init__(self, *args, **kwargs):
        super(WSGIApplication, self).__init__(*args, **kwargs)
        self.router.set_dispatcher(self.__class__.custom_dispatcher)

    @staticmethod
    def custom_dispatcher(router, request, response):
        rv = router.default_dispatcher(request, response)
        router.session_store = sessions.get_store(request=request)
        if isinstance(rv, basestring):
            rv = webapp2.Response(rv)
        elif isinstance(rv, tuple):
            rv = webapp2.Response(*rv)
        router.session_store.save_sessions(rv)
        return rv

    def route(self, *args, **kwargs):
        def wrapper(func):
            self.router.add(routes.RedirectRoute(handler=func, strict_slash=True, *args, **kwargs))
            return func
        return wrapper

    def jinja2_factory(self, app):
        j = jinja2.Jinja2(app)
        j.environment.globals.update({
            'config': app.config,
            'uri_for': webapp2.uri_for
        })
        return j

    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(factory=self.jinja2_factory, app=self)

    def session_store(self):
        return sessions.get_store(request=self.request)

    def session(self):
        return self.session_store().get_session()

    def add_flash(self, value, level=None):
        self.session().add_flash(value, level=level)

    def redirect_to(self, _name, *args, **kwargs):
        return webapp2.redirect_to(_name, *args, **kwargs)

    def render_template(self, _filename, **context):
        session = self.session()
        ctx = {
            'flashes': session.get_flashes(),
            'session': session
        }
        ctx.update(context)
        rv = self.jinja2.render_template(_filename, **ctx)
        return rv

它向应用程序实例添加了方便的方法。这使得类似的事情成为可能:

@app.route('/book/list', methods=['GET'], name='book_list')
def book_list(request):
    return app.render_template('book/list.html', books=[])

@app.route('/book/create', methods=['GET'], name='book_create')
def book_create(request):
    app.add_flash('Create book not yet implemented!', level='warning')
    return app.redirect_to('book_list')

它基于我在https://github.com/commonsense/CommonConsensus/blob/master/server/webapp2_flask.py上找到的代码

欢迎对这种方法提出任何意见!

于 2013-03-28T19:59:53.020 回答
0

重定向与普通的 webapp2 方式相同:

@app.route('/')
def hello_handler(request, *args, **kwargs):
    return webapp2.redirect('/another_url')

至于模板,您只需返回您在渲染模板时获得的字符串作为结果。

于 2013-03-28T09:17:43.670 回答