2012-02-12 61 views
2

我所定义的方法用于渲染的网页:AttributeError的: '<Class name>' 对象没有属性 '请求'

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.') 

当webapp收到URL/nuevogrupo的HTTP GET请求时,它实例化NuevoGrupoHandler类并调用实例的get方法。 所以在这一点上,一切都按预期

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

但是当我打电话从NuevoGrupoHandler.post(),达到方法doRender()内obtenerPagina() 时方法GruposHandler.obtenerPagina(),异常

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

这是我得到的堆栈跟踪:在这行抛出

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

如此看来,东西在未从webapp.WSGIApplication实例调用时没有正确设置。我不确定。

对不起,我无法更好地解释问题。

我应该怎么做才能避免这种异常。

在此先感谢。

+0

doRender()是您的GruposHandler的实例方法吗? – alex 2012-02-12 13:50:53

+0

嗨,亚历克斯。doRender()不属于任何类。它只是在包含其他类的文件中。 – Lucas 2012-02-12 14:16:31

回答

4

我不知道谷歌应用程序引擎,但问题是从你身边,而不是从WSGIApplication。

NuevoGrupoHandler.post方法,你instanciate一个新的GruposHandler(),你用于渲染。并且此实例没有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 

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

+0

非常感谢铁托。 我也发现了另一种解决这个问题的方法。 我刚更换这些行: grupoHandler = GruposHandler() grupoHandler.obtenerPagina( “gruposMios”, '信息:未NUEVO GRUPO FUE agregado。') 通过这样的: self.redirect('/ grupos opcion =? gruposMios') 但我会用你的方法! =) – Lucas 2012-02-12 15:26:43

相关问题