2012-02-12 2 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 получает HTTP-запрос GET на URL/nuevogrupo, он создает экземпляр класса NuevoGrupoHandler и вызывает метод получения экземпляра. Таким образом, в данный момент, все работает, как ожидалось

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

, но когда я вызываю метод GruposHandler.obtenerPagina() из NuevoGrupoHandler.post(), когда метод doRender() внутри obtenerPagina() достигается, исключение отбрасывается на этой линии:

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

Это StackTrace я получаю:

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

Таким образом, кажется, что-то неправильно настроен, если он не вызывается из экземпляра webapp.WSGIApplication. Я не совсем уверен.

Извините, я не мог объяснить проблему лучше.

Что мне делать, чтобы избежать этого исключения.

Заранее спасибо.

+0

Is doRender() метод экземпляра вашего GruposHandler? – alex

+0

Привет, Алекс.doRender() не принадлежит ни одному классу. Это просто внутри файла, который содержит другие классы. – Lucas

ответ

4

Я не знаю о Google-приложении, но проблема связана с вашей стороны, а не с 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.') 

Тогда ваш новый обработчик экземпляра будет иметь тот же запрос, что и текущий, и исключение будет избегать ,

Edit:

Кстати, если вы хотите просто использовать внешний метод, как это было бы лучше, чтобы создать еще BaseClass, реализующие doRender и наследовать от него для GruposHandler и NuevoGrupoHandler:

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", "Informacion: ип Nuevo Grupo ФРУ agregado.) этим: self.redirect ('/ Grupos Opcion =? gruposMios ') Но я буду использовать ваш подход! знак равно – Lucas

Смежные вопросы