Как правильно запрашивать хранилище данных с Python?- проблема с основами - PullRequest
2 голосов
/ 07 сентября 2011

Как новичок в Python и App Engine, я снова должен попросить вас о помощи. Некоторое время я работал с книгой «Код в облаке», чтобы изучить основы использования App Engine. Дело в том, что я пока не очень успешен. Хотя большинство проблем, с которыми я столкнулся, связано с кодировкой / декодированием UTF-8, на этот раз у меня возникают проблемы с выполнением запросов к хранилищу данных.

Для изучения основ я воссоздал код для простого сервиса чата, доступного в главе IV вышеупомянутой книги. Ключевые элементы:

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

from google.appengine.ext import db

#START: ChatMessage
class ChatMessage(db.Model):
    user = db.StringProperty(required=True)
    timestamp = db.DateTimeProperty(auto_now_add=True)
    message = db.TextProperty(required=True)

    def __str__(self):
        return "%s (%s): %s" % (self.user, self.timestamp, self.message)
#END: ChatMessage

Выше я определил модель данных для сообщения

class ChatRoomPage(webapp.RequestHandler):
    def get(self):
        self.response.headers["Content-Type"] = "text/html"
        self.response.out.write("""
           <html>
             <head>
               <title>AppEngine Chat Room</title>
             </head>
             <body>
               <h1>Welcome to AppEngine Chat Room</h1>
               <p>(Current time is %s)</p>
           """ % (datetime.datetime.now()))
        messages = db.GqlQuery("SELECT * From ChatMessage ORDER BY time")
        for msg in messages:
            self.response.out.write("<p>%s</p>" % msg)
        self.response.out.write("""
           <form action="/talk" method="post"> 
          <div><b>Name:</b> 
           <textarea name="name" rows="1" cols="20"></textarea></div>
           <p><b>Message</b></p>
           <div><textarea name="message" rows="5" cols="60"></textarea></div>
           <div><input type="submit" value="Send ChatMessage"/></div>
           </form>
         </body>
       </html>
       """)
# END: MainPage 

В блоке выше я создаю пользовательский интерфейс и выполняю запрос GQL для данных, которые я разместил.

И наконец:

class ChatRoomPoster(webapp.RequestHandler):
    def post(self):
        chatter = self.request.get("name")
        msgtext = self.request.get("message")
        msg = ChatMessage(user=chatter, message=msgtext)
        msg.put()
        self.redirect('/')        

Я создаю обработчик для отправки собранных данных в хранилище данных.

Изучив книгу построчно, а также учебник Google и ряд тем на этом сайте, я до сих пор не могу понять, почему код не работает должным образом. По сути, чат не отображает прошлые сообщения. Я предполагаю, что я делаю что-то не так с доступом к хранимым данным, так как программа не выдает никаких исключений - мне не хватает идентификатора или чего-то в этом роде. Возможно, я снова упускаю что-то очень очевидное.

Буду очень признателен за вашу помощь. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Ваш запрос:

    messages = db.GqlQuery("SELECT * From ChatMessage ORDER BY time")

, но ваша модель хранилища данных не имеет свойства time, она имеет свойство timestamp.Попытка упорядочить по свойству, не принадлежащему ни одному объекту, всегда возвращает пустой набор результатов.

0 голосов
/ 07 сентября 2011

В вашем цикле for над сообщениями msg - это объект хранилища данных. Вам нужно сослаться на определенный атрибут (например, msg.message).

for msg in messages:
    self.response.out.write("<p>%s</p>" % msg.message)
...