Объект AttributeError: '<Имя класса>' не имеет атрибута 'request'

Я определил метод для рендеринга страниц:

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 и вызывает метод get экземпляра. Итак, на данный момент все работает так, как ожидалось

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

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

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

Это стек, который я получаю:

AttributeError: объект 'GruposHandler' не имеет атрибута 'request'

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

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

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

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

Я не знаю о 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.') 

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

Редактировать:

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

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

И реализовать оба метода в базовом классе. 🙂