【问题标题】:Google App Engine-Ajax refresh from datastore using python使用 python 从数据存储区刷新 Google App Engine-Ajax
【发布时间】:2010-10-06 00:19:35
【问题描述】:

我有一个应用程序(用 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 内容一起刷新。在 index.html 每 5 秒自行刷新后,我看到 2 个表单。

谁能指导我可能的原因和解决方案?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    load('/refresh') 的调用将responsecontainer div 的内容替换为加载的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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2011-02-16
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多