1

我修改了这个示例代码,以便让 webapp2 会话在 Google App Engine 上运行。

我需要做什么才能从继承自覆盖该方法的 BaseHandler 的处理程序返回 webapp2.Response 对象dispatch

这是我要编写的处理程序类型的演示:

import webapp2
import logging

from webapp2_extras import sessions


class BaseHandler(webapp2.RequestHandler):
  def dispatch(self):
    # Get a session store for this request.
    self.session_store = sessions.get_store(request=self.request)
    try:
      # Dispatch the request.
      webapp2.RequestHandler.dispatch(self)
    finally:
      # Save all sessions.
      self.session_store.save_sessions(self.response)


class HomeHandler(BaseHandler):
  def get(self):
    logging.debug('In homehandler')
    response = webapp2.Response()
    response.write('Foo')
    return response

config = {}
config['webapp2_extras.sessions'] = {
    'secret_key': 'some-secret-key',
}


app = webapp2.WSGIApplication([
    ('/test', HomeHandler),
], debug=True, config=config)


这段代码显然不起作用,因为 BaseHandler 总是用self. 我已经查看了 的代码webapp2.RequestHandler,但它严重地让我无法修改我的 BaseHandler(或者可能设置自定义调度程序),以便我可以简单地从继承处理程序返回响应对象。

奇怪的是,分配的快捷方式self.response = copy.deepcopy(response)也不起作用。

4

2 回答 2

0

您将两种响应混合在一种方法中。使用任一

return webapp2.Response('Foo')

或者

self.response.write('Foo')

...不是都。

于 2013-06-12T23:31:29.190 回答
0

我查看了 webapp2.RequestHandler 并注意到返回的值只是向上传递了堆栈。

一个对我有用的解决方案是在从处理程序返回时使用返回的响应,或者在没有返回任何内容时使用 self.response。

class BaseHandler(webapp2.RequestHandler):
    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)

        response = None
        try:
            # Dispatch the request.
            response = webapp2.RequestHandler.dispatch(self)
            return response
        finally:
            # Save all sessions.
            if response is None:
                response = self.response
            self.session_store.save_sessions(response)

在我玩游戏时,我注意到当处理程序中引发异常时,我存储为安全 cookie 的会话没有得到更新。

于 2016-03-26T21:15:44.693 回答