0

Это фрагмент из моих tips.html шаблона, включенное в index.html:db.Model.all() возвращает пустой список

{% 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 должен отображать подсказки, доступные в хранилище данных. Но после того, как я добавлю первый совет в datasore, и я перенаправляю ответ от 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)) 
+0

Вы можете показать нам models.py и views.py? –

+0

@ JoãoVilaça Sure, я отредактировал сообщение –

+0

моделей кажется правильным, можете ли вы добавить view.py тоже? чтобы увидеть, является ли это проблемой контекста –

ответ

2

Похоже, вы быть жертвой Eventual Consistency:

Последовательность в контексте GAE хранилище данных и нереализованные, нетехнические, термины - это «доступность последней копии данных». Возможно, более интуитивное (но откровенно неправильное) определение было бы «недостатком лаги между написанием и чтением». Сильное согласование означает минимальное отсутствие задержки, когда данные для записи мгновенно доступны для последующего чтения. В конечном счете последовательное означает, что существует значительное отставание, когда записанные данные будут «в конечном итоге» доступны для чтения после того, как они будут распространены и сохранены в нескольких центрах обработки данных.

Так происходит, что вы возвращаетесь к списку подсказок только после того, как запись была выполнена, но до ее распространения, поэтому данные не находятся в индексе в этот момент. Если вы подождали несколько секунд до перенаправления или обновления, как вы, данные будут там.

Это нормально, и к чему вы привыкнете. Однако хранилище данных гарантирует строго согласованные запросы, если вы используете ancestor query. Если вы новичок в этой теме, эта статья может быть интересной: Balancing Strong and Eventual Consistency with Google Cloud Datastore.

Смежные вопросы