AttributeError: '<类名>' 对象没有 'request' 属性

2 投票
1 回答
2772 浏览
提问于 2025-04-17 12:53

我定义了一个用来渲染页面的方法:

def doRender(handler, tname='index.html',values = {}):
    temp = os.path.join(os.path.dirname(__file__),
                        'templates/'+tname)
    if not os.path.isfile(temp):
        return False

    newval = dict(values)
    newval['path'] = handler.request.path

    user = users.get_current_user()
    url = users.create_login_url(handler.request.uri)
    url_linktext = 'Login'

    if user:
        url = users.create_logout_url(handler.request.uri)
        url_linktext = 'Logout'

    newval['user'] = user
    newval['url'] = url
    newval['url_linktext'] = url_linktext

    outstr = template.render(temp, newval)
    handler.response.out.write(outstr)
    return True

另外,我有这些类:

GruposHandler

class GruposHandler(webapp.RequestHandler):    
    def get(self):
        self.obtenerPagina()

    def obtenerPagina(self, pOpcion = None, pMensajeInformacion = None):
        opcion = pOpcion if pOpcion is not None else self.request.get('opcion') 
        usuario = obtenerUsuario()
        rsGrupos = obtenerGruposAll()
        listaGruposCreadosPorUsuario = []
        #
        #

        for grupo in rsGrupos: 
            if grupo.creadoPorUsuario == usuario:
                listaGruposCreadosPorUsuario.append(grupo)

        blahh...

        if opcion == 'gruposMios':
            doRender(self, 'grupos_mios.html', {'listaGruposCreadosPorUsuario':listaGruposCreadosPorUsuario,
                                                'informacion':pMensajeInformacion})

NuevoGrupoHandler

class NuevoGrupoHandler(webapp.RequestHandler):
    def post(self):
        nombre = self.request.get('nombre')
        descripcion = self.request.get('descripcion')

        #comprobar que no exista un grupo con el mismo nombre
        obj = Grupo.get_by_key_name(nombre)
        if obj:
            doRender(self, 'nuevo_grupo.html', {'mensaje_descripcion':'Ya existe un grupo con ese nombre.'})
        else:
            grupo = model.Grupo(key_name = nombre, nombre=nombre, descripcion = descripcion);
            grupo.put()
            grupoHandler = GruposHandler()
            grupoHandler.obtenerPagina("gruposMios", 'Informacion: un nuevo grupo fue agregado.')

当网页应用收到一个HTTP GET请求,访问的URL是/nuevogrupo时,它会创建一个NuevoGrupoHandler类的实例,并调用这个实例的get方法。到这里,一切都按预期工作。

def main():
    application = webapp.WSGIApplication([
                                          ('/nuevogrupo', NuevoGrupoHandler),
                                          etc...

但是,当我从NuevoGrupoHandler.post()方法中调用GruposHandler.obtenerPagina()时,进入obtenerPagina()里的doRender()方法时,就会在这一行抛出异常:

newval['path'] = handler.request.path

这是我得到的错误信息:

AttributeError: 'GruposHandler' object has no attribute 'request'

所以看起来,当这个方法不是从webapp.WSGIApplication实例调用时,有些东西没有正确设置。我不太确定。

抱歉我没能更好地解释这个问题。

我该怎么做才能避免这个异常呢?

提前谢谢你。

1 个回答

4

我对谷歌应用引擎不太了解,但问题出在你这边,而不是WSGIApplication。

NuevoGrupoHandler.post这个方法里,你创建了一个新的GruposHandler()实例,用来进行渲染。但是这个新实例没有request这个属性,这就导致了你的异常。

我的建议是把你当前实例的request属性复制到新的实例上:

grupoHandler = GruposHandler()
grupoHandler.request = self.request # <<< add this
grupoHandler.response = self.response # <<< and this
grupoHandler.obtenerPagina("gruposMios", 'Informacion: un nuevo grupo fue agregado.')

这样你的新实例处理器就会和当前的实例有相同的请求,这样就能避免异常了。

补充:

顺便说一下,如果你只是想使用一个外部方法,最好是创建一个新的基类来实现doRender,然后让GruposHandlerNuevoGrupoHandler继承这个基类:

class RenderRequestHandler(webapp.RequestHandler):
    def obtenerPagina(self, ...):
        pass

    def do_render(self):
        pass

class GruposHandler(RenderRequestHandler):
    pass

class NuevoGrupoHandler(RenderRequestHandler):
    pass

然后在基类中实现这两个方法。:)

撰写回答