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

RE: テンプレート

webapp2 にはテンプレート エンジンが組み込まれていないようです。ただし、Python 用の非常に高品質なテンプレート システムがたくさんあります。最も人気のあるものには、jinja2django-templates、およびPystacheが含まれます。

Google App Engine へのデプロイを計画している場合は、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 に答える