我定义了一种呈现页面的方法:
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})
新教徒
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()调用方法GruposHandler.obtenerPagina()时,当方法doRender()在obtenerPagina()中时
到达时,在此行引发异常:
newval['path'] = handler.request.path
这是我得到的stacktrace:
AttributeError:“GruposHandler”对象没有属性“request”
因此,当某些内容不是从webapp.WSGIApplication实例调用时,它似乎没有正确设置。我不太确定。
对不起,我不能更好地解释这个问题。
我该怎么做才能避免这种例外。
提前谢谢。
最佳答案
我不知道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
并在基类中实现这两个方法。:)
关于python - AttributeError:'<类名称>'对象没有属性'request',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9249086/