Google app engine 在requesthandler类方法中而不是在函数中处理webapp2 404错误

Google app engine 在requesthandler类方法中而不是在函数中处理webapp2 404错误,google-app-engine,webapp2,Google App Engine,Webapp2,我正在谷歌应用程序引擎(Python)中使用webapp2框架。在中,描述了如何处理函数中的404错误: import logging import webapp2 def handle_404(request, response, exception): logging.exception(exception) response.write('Oops! I could swear this page was here!') response.set_status(4

我正在谷歌应用程序引擎(Python)中使用webapp2框架。在中,描述了如何处理函数中的404错误:

import logging
import webapp2

def handle_404(request, response, exception):
    logging.exception(exception)
    response.write('Oops! I could swear this page was here!')
    response.set_status(404)

def handle_500(request, response, exception):
    logging.exception(exception)
    response.write('A server error occurred!')
    response.set_status(500)

app = webapp2.WSGIApplication([
    webapp2.Route('/', handler='handlers.HomeHandler', name='home')
])
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500
如何在该类的
.get()
方法中处理
webapp2.RequestHandler
类中的404错误

编辑:

class Webapp2HandlerAdapter(webapp2.BaseHandlerAdapter):
    def __call__(self, request, response, exception):
        request.route_args = {}
        request.route_args['exception'] = exception
        handler = self.handler(request, response)
        return handler.get()

class Handle404(MyBaseHandler):
    def get(self):
        self.render(filename="404.html",
            page_title="404",
            exception=self.request.route_args['exception']
        )

app = webapp2.WSGIApplication(urls, debug=True, config=config)
app.error_handlers[404] = Webapp2HandlerAdapter(Handle404)
我想调用
RequestHandler
的原因是为了访问会话(
request.session
)。否则,我无法将当前用户传递到404错误页面的模板。i、 e.在屏幕上,您可以看到您的用户名。我想在我的网站的404错误页面上显示当前用户的用户名。这在函数中是可能的还是必须是
RequestHandler

根据@proppy的答案更正代码:

class Webapp2HandlerAdapter(webapp2.BaseHandlerAdapter):
    def __call__(self, request, response, exception):
        request.route_args = {}
        request.route_args['exception'] = exception
        handler = self.handler(request, response)
        return handler.get()

class Handle404(MyBaseHandler):
    def get(self):
        self.render(filename="404.html",
            page_title="404",
            exception=self.request.route_args['exception']
        )

app = webapp2.WSGIApplication(urls, debug=True, config=config)
app.error_handlers[404] = Webapp2HandlerAdapter(Handle404)

错误处理程序和请求处理程序可调用项的调用约定不同:

  • 错误\u处理程序
    执行
    (请求、响应、异常)
  • RequestHandler
    接受
    (请求、响应)
您可以使用类似的方法将
webapp2.RequestHandler
改编为可调用的

class Webapp2HandlerAdapter(BaseHandlerAdapter):
    """An adapter to dispatch a ``webapp2.RequestHandler``.

    The handler is constructed then ``dispatch()`` is called.
    """

    def __call__(self, request, response):
        handler = self.handler(request, response)
        return handler.dispatch()

但是您必须在request
route_args

中隐藏额外的异常参数。您能否给出一个
RequestHandler
类的示例,该类派生自
webapp2handleAdapter
,并处理404错误,我的应用程序中的每个
RequestHandler
都是从
BaseRequestHandler
派生的。如果错误处理程序类是从这两个类(
BaseRequestHandler
webapp2handleAdapter
)派生的,那么您可以使用
callable=webapp2handleAdapter(handlers.HomeHandler)
转换可调用文件中的处理程序。但是您需要调整
Webapp2HandlerAdapter.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。根据你的回答,你可以在问题中看到我的代码。知道为什么会抛出异常吗?