我改编了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
调用dispatch。我查看了webapp2.RequestHandler
的代码,但它严重地使我无法修改我的BaseHandler(或者可能设置自定义调度程序),以便我可以简单地从继承处理程序返回响应对象。
奇怪的是,分配self.response = copy.deepcopy(response)
的快捷方式也不起作用。
答案 0 :(得分:0)
您在一种方法中混合了两个响应。使用
return webapp2.Response('Foo')
或
self.response.write('Foo')
......不是两个。
答案 1 :(得分:0)
我看了一下webapp2.RequestHandler并注意到返回的值只是向上传递。
对我有用的解决方案是在从处理程序返回一个时使用返回的Response,或者在没有返回任何内容时使用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的会话在处理程序中引发异常时没有得到更新。