2012-02-12 3 views
2

내가 렌더링 페이지에 대한 방법을 정의 없습니다 :AttributeError가 '<Class name>'개체가 어떤 속성 '요청'

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}) 
: 또한

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 

을, 나는이 수업을

누에 보 그루도 핸들러

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

을 예상대로 작동하지만 obtenerPagina() 내부의 방법 doRender은()에 도달 NuevoGrupoHandler.post()에서 방법 GruposHandler.obtenerPagina() 예외를 호출 할 때 이것은 내가 갖는 스택 트레이스가

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

:이 줄을 던져

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

는 그래서 뭔가를 보인다 webapp.WSGIApplication 인스턴스에서 호출되지 않으면 올바르게 설정되지 않습니다. 난 그렇게까지 확신은 못해.

죄송합니다. 문제를 더 잘 설명하지 못했습니다.

예외를 피하기 위해 어떻게해야합니까?

미리 감사드립니다.

+0

doRender()는 GruposHandler의 인스턴스 메소드입니까? – alex

+0

안녕하세요.doRender()는 어떤 클래스에도 속하지 않습니다. 다른 클래스가 들어있는 파일 안에 있습니다. – Lucas

답변

4

google-app-engine에 대해 잘 모르겠지만 WSGIApplication이 아닌 귀하의 측면에서 문제가 있습니다.

NuevoGrupoHandler.post 메서드에서 렌더링을 위해 사용하는 새로운 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을 구현하는 또 다른의 base class를 작성하고 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 ','에 관한 것은 : 유엔 누에 GRUPO FUE agregado. ')이로 : self.redirect ('/ grupos opcion =? 난 그냥이 라인을 교체 gruposMios ') 하지만 당신의 접근 방식을 사용합니다! =) – Lucas

관련 문제