【发布时间】:2013-03-24 04:53:32
【问题描述】:
我调整了this sample code,以便让 webapp2 会话在 Google App Engine 上运行。
我需要做什么才能从一个继承自覆盖dispatch 方法的 BaseHandler 的处理程序中获得return webapp2.Response objects?
这是我想要编写的处理程序类型的演示:
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) 的快捷方式也不起作用。
【问题讨论】:
-
您忘记了代码中的两个重要部分,它们是您改编的示例的一部分。 1) 具有缓存属性的会话方法 2) 在基本处理程序中使用会话,使用 self.session...
-
我知道 - 在我的实际应用程序中,我的会话工作正常(使用您提到的方法),它们不是问题。这只是理解调度和处理程序子类化问题所需的基本示例。
-
为什么要返回响应对象?你想用它做什么?
-
我正在调整一个已经从请求数据构造响应对象的库 (github.com/StartTheShift/pyoauth2)。我不介意将返回的响应对象复制到
self.response的开销,但鉴于 deepcopy 分配不起作用...... - 单独复制每个响应属性似乎相当丑陋且容易出错。 -
也许设置 self.response=response ?我以前没有尝试过,但它可能会起作用......
标签: python google-app-engine session webapp2