[Python]y[Google App Engine] problema con las bases de datos

Iniciado por kerith, 29 Diciembre 2010, 14:40 PM

0 Miembros y 3 Visitantes están viendo este tema.

kerith

Buenas, estoy jugando un poco con google App Engine y plantillas Django, y me he propuesto escribir un protoservicio de chat.

El caso es que me ha surgido un problema a la hora de hacer llamadas a la base de datos y recuperar los mensajes para imprimirlos en la textarea html. El problema es que una vez hecha la llamada, se crea un objeto, pero no reconoce la propiedad 'mensaje', que es la que tiene el texto mismo del mensaje.

Código (python) [Seleccionar]

import wsgiref.handlers
import os

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

from google.appengine.ext.webapp.util import run_wsgi_app

class MainHandler(webapp.RequestHandler):
   def get(self):
       user = users.get_current_user()
       mensajes = db.GqlQuery('SELECT * FROM Mensaje')
       if user:
           if mensajes.mensaje: ##Comprueba si hay mensajes en el objeto mensaje
               nickname = user.nickname()
               template_values = {'nickname' : nickname,
                                   'mensaje' : mensajes,}
               greeting = self.response.out.write(template.render('main.html', template_values))
           else:
               greeting = self.response.out.write('El problema es con la base de datos')
       else:
               greeting = ("<html><body><a href=\"%s\">Sign in or register</a></body></html>." %
                           users.create_login_url("/"))

       self.response.out.write(greeting)

   def post(self):
       textomensaje = self.request.get('txtboxMsg')      ##Esto guerda el mensaje
       mensaje = Mensaje(mensaje = textomensaje)   ##en la base de datos,
       mensaje.put()                                               ##funciona bien (comprobado)
       self.redirect('/')                                          

class Mensaje(db.Model):
   mensaje = db.StringProperty(required = True)
   hora = db.DateTimeProperty(auto_now_add = True)

def main():
   application = webapp.WSGIApplication([('/', MainHandler)],
                                        debug=True)
   util.run_wsgi_app(application)


if __name__ == '__main__':
   main()


Aqui esta el simple codigo del programa

Solo me arrepiento de no vivir lo suficiente para saciar mi curiosidad.

Novlucker

Seguro que esa consulta esta devolviendo algo?

Intenta cambiando esto
Código (python) [Seleccionar]
mensajes = db.GqlQuery('SELECT * FROM Mensaje').fetch()

En tu code estas guardando la consulta, pero no la estas ejecutando, y tengo mis dudas de si se retorna con solo verificar verificar la propiedad mensaje.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

kerith

ya lo he intentado así, pero me da da error ('list' object has no attribute 'mensaje').

Además, en el ejemplo de Google http://code.google.com/intl/es-AR/appengine/docs/python/gettingstarted/usingdatastore.html y en el video demostrativo [youtube=425,350]http://www.youtube.com/watch?v=bfgO-LXGpTM[/youtube] no usa el comando .fetch() y funciona.

Gracias por tomarte interés y responder tan rapido.

salu2, kerith

Solo me arrepiento de no vivir lo suficiente para saciar mi curiosidad.

Novlucker

Claaaaaaaaaro! no me había dado cuenta ;D
mensajes es una lista, por lo que la lista no tiene la propiedad mensaje, lo que tiene la propiedad mensaje son los elementos de esa lista :P
Por ej:
Código (python) [Seleccionar]
mensajes = db.GqlQuery('SELECT * FROM Mensaje')
#si funciona sin fetch, entonces no lo ponemos :P
print mensajes[0].mensaje


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

kerith

Diosss, llevo más de 6 horas con el mismo problema, y sin darme cuenta de que era una lista!! (en estos momentos me siento a medio camino entre la estupidez y el noobismo XD).

Muchas gracias por descubrirlo, ahora tengo que encontrar la manera de incluirlo en la platilla de Django.

salu2, kerith

Solo me arrepiento de no vivir lo suficiente para saciar mi curiosidad.

Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

kerith

Muchísimas gracias por todo, ya he solucionado el problema.
Si alguien quiere el código fuente no tiene más que pedirlo.

salu2, kerith

Solo me arrepiento de no vivir lo suficiente para saciar mi curiosidad.