db.Model.all()返回一个空列表

时间:2015-05-30 13:36:01

标签: html python-2.7 google-app-engine jinja2 google-cloud-datastore

这是我tips.html模板的一个片段,包含在index.html中:

{% for t in tips %}
<div class="col-lg-4 col-sm-6">          
  <form action="comment.html" method="get" class="portfolio-box">
    <img src="img/portfolio/4.jpg" class="img-responsive" alt="">
    <div class="portfolio-box-caption">
      <div class="portfolio-box-caption-content">
        <div class="project-category text-faded">
          {{ t.title }}
        </div>
        <div class="project-name">
          {{ t.content }}                                                                       
        </div>
        <div><br /></div>
        {% if user != 'None' %}
          <input type="hidden" name="tipTitle" value="{{ t.title }}">
          <input type="hidden" name="tipContent" value="{{ t.content }}">
          <input type="hidden" name="hparam" value="tips">
          <div><button class="btn btn-default btn-l wow tada">Explore</button></div>
        {% endif %}
        </div>
      </div>
    </form>          
   </div>
{% endfor %}

此html块应显示数据存储区中可用的提示。但是,在我将第一个提示添加到数据库后,我将响应从addtip.html重定向到index.html我只得到一个带有图片的div但是没有{{ t.title }}{{ t.content }}我刷新页面。

我将Tip.all()传递给index.html tips

models.py

from google.appengine.ext import db
class User(db.Model):
    fullName = db.StringProperty()
    username = db.StringProperty()
    email = db.StringProperty()    
    password = db.StringProperty()
    def getKey(self):
        return self.key()    
class Tip(db.Model):
    title = db.StringProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)
    img = db.BlobProperty()
    user = db.ReferenceProperty(User, collection_name='tips') 
    def getKey(self):
        return self.key()    
class Comment(db.Model):
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)
    user = db.ReferenceProperty(User, collection_name='comments')
    tip = db.ReferenceProperty(Tip, collection_name='comments')

我的处理程序

class MainPage(BaseHandler):         
    def get(self):        
        template = JINJA_ENVIRONMENT.get_template('index.html')
        query = Tip.all()            
        context = {                   
                'title' :'OutgoingIndex - ' + currentUser.username,
                'user' : currentUser.username,
                'tips' : query
                }
        self.response.write(template.render(context))

1 个答案:

答案 0 :(得分:2)

看起来你是Eventual Consistency的受害者:

  

GAE数据存储环境的一致性,以及非常简单的非技术性术语,是“最新数据副本的可用性”。也许更直观(但公然不正确)的定义是“写入与读取之间缺乏延迟”。强烈一致意味着最小到无滞后,其中书面数据可立即用于后续读取。最终的一致意味着存在相当大的滞后,在将数据传播并存储在多个数据中心之后,写入数据将“最终”可用于读取。

所以会发生的事情是,在写入完成之后,但在传播之前,您将返回到提示列表,因此此时数据不在索引中。如果您在重定向之前等待几秒钟,或者像您一样刷新,那么数据就会在那里。

这是正常的,你会习惯的东西。但是,如果使用ancestor query,数据存储区可以保证一致的查询。如果您是这个主题的新手,那么本文可能很有趣:Balancing Strong and Eventual Consistency with Google Cloud Datastore