2010-10-06 118 views
4

我有一个应用程序(用python开发)需要每隔5秒钟从数据存储区刷新视图。我已经出来了一个JavaScript函数,并使用ajax处理刷新。Google App Engine - 使用python从数据存储区刷新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个表单。

任何人都可以指导我可能的原因和解决方案吗?

回答

8

致电load('/refresh')用加载的HTML替换responsecontainer div的内容。

因此,您需要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> 
相关问题