AttributeError: объект <имя класса> не имеет атрибута 'request' - PullRequest
2 голосов
/ 12 февраля 2012

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

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. Я не так уверен.

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

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

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

1 Ответ

4 голосов
/ 12 февраля 2012

Я не знаю о 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, и наследовать от него для GruposHandler и NuevoGrupoHandler:

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

    def do_render(self):
        pass

class GruposHandler(RenderRequestHandler):
    pass

class NuevoGrupoHandler(RenderRequestHandler):
    pass

И реализовать оба метода вбазовый класс.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...