【问题标题】:db.Model.all() returns an empty listdb.Model.all() 返回一个空列表
【发布时间】:2015-08-13 08:07:31
【问题描述】:

这是我的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))

【问题讨论】:

  • 你能给我们看看models.py和views.py吗?
  • @JoãoVilaça 当然,我编辑了帖子
  • models 似乎是正确的,你也可以添加 view.py 吗?看看是否是上下文问题
  • 好吧,我的视图基本上是 html 文件,我没有 view.py @JoãoVilaça 你的意思是处理程序吗?
  • 好吧,你总是有一个 urls.py、views.py 和 models.py,html 和 models.py 是正确的,所以问题是“提示”被传递而没有任何价值,它是空的,所以它可能是一个上下文问题,您可以在文件 views.py 上处理它

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


【解决方案1】:

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

在 GAE 数据存储环境中的一致性,用非常简单、非技术性的术语来说,就是“最新数据副本的可用性”。也许更直观(但明显不正确)的定义是“写入和读取之间没有延迟”。强一致性意味着最小甚至没有延迟,写入的数据可以立即用于后续读取。最终一致意味着存在相当大的延迟,写入的数据在传播并存储在多个数据中心后“最终”可供读取。

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

这是正常的,你会习惯的。但是,如果您使用 ancestor query,则数据存储可以保证查询的高度一致。如果您不熟悉这个主题,这篇文章可能会很有趣:Balancing Strong and Eventual Consistency with Google Cloud Datastore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多