如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?
Posted
技术标签:
【中文标题】如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?【英文标题】:How to asyncronously load posts from DB to django template on google app engine? 【发布时间】:2012-11-08 21:10:27 【问题描述】:我有一个网页,正在将数据库中的记录提供给 Google App Engine 中的 Django html 模板。是否可以异步加载帖子,例如当用户在页面上向下滚动 10 个帖子时,它会加载另外 10 个帖子?我应该在模板中使用某种 jQuery 来执行此操作,还是异步数据库获取?
class MainHandler(webapp2.RequestHandler):
def get(self):
records_query = db.GqlQuery("SELECT * FROM Record order by date desc")
records = records_query.fetch(10)
self.response.out.write(records_query)
template_values =
'records': records,
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
class Page(webapp2.RequestHandler):
def get(self,page):
numberOfPages = int(page)
records_query = db.GqlQuery("SELECT * FROM Record order by date desc")
records = records_query.fetch(numberOfPages * 10)
records = records[((numberOfPages- 1) * 10):]
template_values =
'records': records,
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
在模板中,它只是对从 DB 发送的记录进行的普通循环
% for record in records %
record.title record.body
% endfor %
【问题讨论】:
您必须使用 javascript 并使用“无限滚动”插件或其他脚本。 查看一些演示:jquery4u.com/tutorials/jquery-infinite-scrolling-demos。我需要一个处理程序来实际从 DB 中获取数据,您的脚本将调用该处理程序,然后将新数据插入到页面中。 很好,我找到了一个解决方案,我正在研究那里。当我完成编码后,我会发布答案。 您还应该查看 ndb 游标:developers.google.com/appengine/docs/python/ndb/queries#cursors 【参考方案1】:这是我的解决方案。现在,当您滚动到底部时,它会异步加载。它基于this site的第二个示例
模板.html:
<div id="postswrapper">
<div class="item">content</div>
<div id="loadmoreajaxloader" style="display:none;"><center><img src="ajax-loader.gif" /></center></div>
</div>
<script type="text/javascript">
var pageCounter = 2;
$(window).scroll(function()
if (pageCounter > 0)
if($(window).scrollTop() == $(document).height() - $(window).height())
$('div#loadmoreajaxloader').show();
$.ajax( url: "./page/" + pageCounter , success: function(html)
if(html)
$("#postswrapper").append(html);
$('div#loadmoreajaxloader').hide();
pageCounter++;
else
pageCounter = -1;
$('div#loadmoreajaxloader').html('<center>No more posts to show.</center>');
);
pageCounter = -1;
);
</script>
这是 main,py 中从 DB 加载帖子的方法。
class Page(webapp2.RequestHandler):
def get(self,page):
numberOfPages = int(page)
records_query = db.GqlQuery("SELECT * FROM Record order by date desc")
records = records_query.fetch(numberOfPages * 10)
records = records[((numberOfPages- 1) * 10):]
if len(records) > 0:
template_values =
'records': records,
path = os.path.join(os.path.dirname(__file__), 'posts.html')
self.response.out.write(template.render(path, template_values))
这是加载到主模板中的模板。 post.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
% for record in records %
<div class="oneRecord">
<img src=" record.imageCacheURL " />
<a href ="./ record.imageID "> record.title|escape </a>
</div>
% endfor %
</body>
</html>
【讨论】:
以上是关于如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?的主要内容,如果未能解决你的问题,请参考以下文章
在谷歌应用引擎中将数据流式传输到 bigquery - java