Google App Engine - обновление Ajax из хранилища данных с использованием python - PullRequest
4 голосов
/ 06 октября 2010

У меня есть приложение (разработанное на python), которое требует обновленного представления из хранилища данных каждые 5 секунд. Я вышел с функцией javascript и обработал обновление, используя ajax.

Функция Ajax

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>      <script type="text/javascript">             var refreshId = setInterval(function()          {           $('#responsecontainer').fadeOut("slow").load('/refresh').fadeIn("slow");            }, 5000);       </script>

После этого у меня есть набор тегов div (responsecontainer), которые заключают в себе параметры, возвращаемые со стороны сервера для отображения.

<div id="responsecontainer">
    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author.nickname }}</b> wrote:
        <a href="/sign?key={{ greeting.key.id }}&auth={{ greeting.author.nickname }}">Delete</a>
      {% else %}
       An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>

    {% endfor %}
</div>

      <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook" name="submitGuestBk"></div>

    </form>

Мой серверный код должен запросить хранилище данных и отобразить результат обратно в файл шаблона (index.html).

class RefreshPage(webapp.RequestHandler):
  def get(self):
    greetings_query = Greeting.all().order('-date')
    greetings = greetings_query.fetch(10)

    if users.get_current_user():
      url = users.create_logout_url(self.request.uri)
      url_linktext = 'Logout'
    else:
      url = users.create_login_url(self.request.uri)
      url_linktext = 'Login'

    template_values = {
      'greetings': greetings,
      'url': url,
      'url_linktext': url_linktext,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, {}))

Однако, когда я запускаю приложение, результаты обновляются вместе с содержимым html, таким как формы и таблицы. Вместе я вижу 2 формы после того, как index.html обновляется сам каждые 5 секунд.

Кто-нибудь может подсказать мне возможную причину и решение?

1 Ответ

8 голосов
/ 06 октября 2010

Вызов load('/refresh') заменяет содержимое элемента responsecontainer на загруженный HTML.

Поэтому вам нужен обработчик RefreshPage, чтобы просто вернуть этот HTML, а не всю страницу. Например, он должен использовать шаблон, который просто содержит это:

{% for greeting in greetings %} 
  {% if greeting.author %} 
    <b>{{ greeting.author.nickname }}</b> wrote: 
    <a href="/sign?key={{ greeting.key.id }}&auth={{ greeting.author.nickname }}">Delete</a> 
  {% else %} 
   An anonymous person wrote: 
  {% endif %} 
  <blockquote>{{ greeting.content|escape }}</blockquote> 
{% endfor %} 

Чтобы избежать дублирования этого содержимого в обоих шаблонах, вы можете сделать так, чтобы ваш основной шаблон включал этот под-шаблон в div, например:

<div id="responsecontainer"> 
    {% include "sub_template.html" %} 
</div> 

<form action="/sign" method="post"> 
<div><textarea name="content" rows="3" cols="60"></textarea></div> 
<div><input type="submit" value="Sign Guestbook" name="submitGuestBk"></div> 
</form> 
...