Google App Engine - 使用Python从数据存储进行Ajax刷新
我有一个用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自动刷新后,我看到有两个表单。
有没有人能告诉我可能的原因和解决办法?
1 个回答
8
调用 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 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>