App Engine webapp.RequestHandler子实例在__init__期间没有self.request

gru*_*cha 0 google-app-engine request-headers

我使用修改过的webapp.RequestHandler处理我的应用程序中的请求:

class MyRequestHandler(webapp.RequestHandler):
    """
    Request handler with some facilities like user.
    self.out is the dictionary to pass to templates 
    """
    def __init__(self, *args, **kwargs):
        super(MyRequestHandler, self).__init__(*args, **kwargs)
        self.out = {
            'user': users.get_current_user(),
            'logout_url': users.create_logout_url(self.request.uri)
            }

    def render(self, template_name):
        """
        Shortcut to render templates
        """
        self.response.out.write(template.render(template_name, self.out))


class DeviceList(MyRequestHandler):
    def get(self):
        self.out['devices'] = GPSDevice.all().fetch(1000)
        self.render('templates/device_list.html')
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外:

line 28, in __init__
    self.out['logout_url'] = users.create_logout_url(self.request.uri)
AttributeError: 'DeviceList' object has no attribute 'request'
Run Code Online (Sandbox Code Playgroud)

当导致异常的代码移出__init__一切都很好时:

class MyRequestHandler(webapp.RequestHandler):
    """
    Request handler with some facilities like user.
    self.out is the dictionary to pass to templates and initially it contains user object for example
    """
    def __init__(self, *args, **kwargs):
        super(MyRequestHandler, self).__init__(*args, **kwargs)
        self.out = { 'user': users.get_current_user(), }

    def render(self, template_name):
        """
        Shortcut to render templates
        """
        self.out['logout_url'] = users.create_logout_url(self.request.uri)
        self.response.out.write(template.render(template_name, self.out))
Run Code Online (Sandbox Code Playgroud)

那是什么?为什么self.request父母的(即webapp.RequestHandler's)__init__被执行后没有?

Dre*_*ars 6

http://code.google.com/appengine/docs/python/tools/webapp/requesthandlerclass.html#RequestHandler_initialize

initialize(request,response)使用Request和Response对象初始化处理程序实例.通常,WSGIApplication在实例化处理程序类之后执行此操作.

看起来你想要覆盖初始化而不是init,如果你期望已经填充了请求对象.