应用程序引擎分页ndb Cursor - python:生成相同的游标,导致重复输出结果

时间:2013-07-28 19:58:12

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

我从我的appengine日志中意识到每次生成相同的光标,就会调用Homehandler。 请知道我做错了什么,下面是我的代码片段:

class HomeHandler(webapp2.RequestHandler):
def get(self):
    #page=self.request.get("page", default_value="1");
    q = Allnews.query().order(-Allnews.date_added)
    cursor = ndb.Cursor(urlsafe=self.request.get('cursor',default_value=None))
    items, next_curs, more = q.fetch_page(30, start_cursor=cursor)
    if more:
        next_c = next_curs.urlsafe()
    else:
        next_c = None
    context = { "news":items,"cursor":next_c}
    # context["headlines"]=Feed.query(Feed.feed_cat.title == 'Headlines')
    # context["gossip"] = Feed.query(Feed.feed_cat.title == 'Gossip')
    # context["sports"] = Feed.query(Feed.feed_cat.title == 'Sports')
    self.response.out.write(template.render('templates/homefeed.html',context))  

这是我的homefeed.html模板的一部分,我使用'无限滚动'技术来获取更多结果

<script>
{% if cursor %}
$(window).scroll(function()
{
var src=$("#src_val").val();
if($(window).scrollTop() == $(document).height() - $(window).height())
{
    $('div#loadmoreajaxloader').show();
    $.ajax({
    url:"/home",
    type:'GET',
    data: {cursor: '{{cursor}}',feed_id:src },
    success: function(news)
    {
        if(news)
        {
            $("#wrapper").append(news);
              $('div#loadmoreajaxloader').hide();

        }else
        {
        $('div#loadmoreajaxloader').html('No more posts to show.');
        }
    }
    });
}
});
{% endif %}
</script>

1 个答案:

答案 0 :(得分:1)

看起来您正在使用get()方法来显示页面和处理AJAX请求。它正确地生成了一个带有初始游标的页面,但是你的$.ajax()方法期望它返回JSON数据。

将页面请求和AJAX请求拆分为两种方法。尝试向HomeHandler添加post()方法,返回JSON数据,如下所示:

import json

def post(self):
    q = Allnews.query().order(-Allnews.date_added)
    cursor = ndb.Cursor(urlsafe=self.request.get('cursor',default_value=None))
    items, next_curs, more = q.fetch_page(30, start_cursor=cursor)
    if more:
        next_c = next_curs.urlsafe()
    else:
        next_c = None
    self.response.headers['Content-Type'] = 'application/json'   
    self.response.out.write(json.dumps({'news': items, 'cursor': next_c))

现在你有一个方法可以将JSON数据返回给AJAX请求:

<script>
var cursor = null;
$(window).scroll(function()
{
if($(window).scrollTop() == $(document).height() - $(window).height())
{
    $.ajax({
    url:"/home",
    type:'POST',
    data: {cursor: cursor},
    success: function(data)
    {
        $("#wrapper").append(data['news']);
        cursor = data['cursor'];
        if ( !cursor )
            $('div#loadmoreajaxloader').show().html('No more posts to show.');
    }
    });
}
});
</script>

注意如何在每个AJAX请求上更新游标值。这是你在下一个请求上获得新光标的方法。

(此代码未经过测试,您可能需要对其进行调试。)