Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: kerith en 29 Diciembre 2010, 14:40 pm



Título: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: kerith en 29 Diciembre 2010, 14:40 pm
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
  1. import wsgiref.handlers
  2. import os
  3.  
  4. from google.appengine.api import users
  5. from google.appengine.ext import webapp
  6. from google.appengine.ext import db
  7. from google.appengine.ext.webapp import util
  8. from google.appengine.ext.webapp import template
  9.  
  10. from google.appengine.ext.webapp.util import run_wsgi_app
  11.  
  12. class MainHandler(webapp.RequestHandler):
  13.    def get(self):
  14.        user = users.get_current_user()
  15.        mensajes = db.GqlQuery('SELECT * FROM Mensaje')
  16.        if user:
  17.            if mensajes.mensaje: ##Comprueba si hay mensajes en el objeto mensaje
  18.                nickname = user.nickname()
  19.                template_values = {'nickname' : nickname,
  20.                                    'mensaje' : mensajes,}
  21.                greeting = self.response.out.write(template.render('main.html', template_values))
  22.            else:
  23.                greeting = self.response.out.write('El problema es con la base de datos')
  24.        else:
  25.                greeting = ("<html><body><a href=\"%s\">Sign in or register</a></body></html>." %
  26.                            users.create_login_url("/"))
  27.  
  28.        self.response.out.write(greeting)
  29.  
  30.    def post(self):
  31.        textomensaje = self.request.get('txtboxMsg')      ##Esto guerda el mensaje
  32.        mensaje = Mensaje(mensaje = textomensaje)   ##en la base de datos,
  33.        mensaje.put()                                               ##funciona bien (comprobado)
  34.        self.redirect('/')                                          
  35.  
  36. class Mensaje(db.Model):
  37.    mensaje = db.StringProperty(required = True)
  38.    hora = db.DateTimeProperty(auto_now_add = True)
  39.  
  40. def main():
  41.    application = webapp.WSGIApplication([('/', MainHandler)],
  42.                                         debug=True)
  43.    util.run_wsgi_app(application)
  44.  
  45.  
  46. if __name__ == '__main__':
  47.    main()
  48.  

Aqui esta el simple codigo del programa


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: Novlucker en 29 Diciembre 2010, 15:10 pm
Seguro que esa consulta esta devolviendo algo?

Intenta cambiando esto
Código
  1. 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


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: kerith en 29 Diciembre 2010, 15:43 pm
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 (http://code.google.com/intl/es-AR/appengine/docs/python/gettingstarted/usingdatastore.html) y en el video demostrativo bfgO-LXGpTM no usa el comando .fetch() y funciona.

Gracias por tomarte interés y responder tan rapido.

salu2, kerith


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: Novlucker en 29 Diciembre 2010, 15:47 pm
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
  1. mensajes = db.GqlQuery('SELECT * FROM Mensaje')
  2. #si funciona sin fetch, entonces no lo ponemos :P
  3. print mensajes[0].mensaje

Saludos


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: kerith en 29 Diciembre 2010, 16:24 pm
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


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: Novlucker en 29 Diciembre 2010, 16:53 pm
Eso no debería de dar trabajo, no has revisado esto? :P
http://code.google.com/p/google-app-engine-samples/

Saludos


Título: Re: [Python]y[Google App Engine] problema con las bases de datos
Publicado por: kerith en 30 Diciembre 2010, 02:21 am
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