Python 如何使Django模板呈现来自视图的一组结果,并在不刷新页面的情况下不断调用视图以获取更多结果

Python 如何使Django模板呈现来自视图的一组结果,并在不刷新页面的情况下不断调用视图以获取更多结果,python,django,api,twitter,tweepy,Python,Django,Api,Twitter,Tweepy,我正在制作一个twitter应用程序,它基于搜索查询从twitter REST API获取推文。现在根据这些结果,我只想在前端显示那些转发次数超过2次的推文。在我的查询中,每100条tweet中只有几条满足这一标准。所以要显示100条这样的推文,其中有2条以上的转发,我必须处理5-10k条推文。但一次API调用最多可以获取100条推文 现在,如果我在我的views.py中获取5-10k条tweets,对它们进行处理,提取我需要的tweets,然后将其作为上下文传递给django模板(或者我只是将

我正在制作一个twitter应用程序,它基于搜索查询从twitter REST API获取推文。现在根据这些结果,我只想在前端显示那些转发次数超过2次的推文。在我的查询中,每100条tweet中只有几条满足这一标准。所以要显示100条这样的推文,其中有2条以上的转发,我必须处理5-10k条推文。但一次API调用最多可以获取100条推文

现在,如果我在我的
views.py
中获取5-10k条tweets,对它们进行处理,提取我需要的tweets,然后将其作为上下文传递给django模板(或者我只是将api结果原样传递给模板,只显示符合条件的tweets),-然后,它显然无法工作,因为用户不能等待网站加载,直到所有推文都处理完毕。通常会发生超时

那么,我有没有办法:

  • 在视图中获取调用中的前100条推文
  • 在模板上呈现满足条件的tweet(前端)
  • 保持
    views.py
    在后台运行api调用,并在不刷新页面的情况下,继续呈现满足模板上当前结果集下条件的推文
  • 我使用的Twitter库是Tweepy

    views.py:

    模板:


    或者有没有一种方法可以从django模板本身动态调用?但这会呈现结果并加载到目前为止获取的任何内容,并在页面加载后进行rest调用,还是只是等待在页面完全加载之前进行所有调用?

    您能通过AJAX从模板调用此视图吗?如果可以将分页与AJAX结合使用,则可以使用分页。只需要从ajax请求中获取两个参数(开始、结束)。在模板中,您可以调用AJAX请求,如下所示:

    $(document).ready(function(){
        $.ajax({
             type: "POST",
             url: '{% url "ajax-filter-tweets" %}',
             data: {'start':100, 'end':200},
             dataType: "json",
             success: function(data) {
             //append new tweets via js code here
             // at the end send another ajax if more tweets in queue
        },
        error: function(){
            //your error handling here
            }
        });
    });
    
    您可以将$.ajax()函数发送到此视图的url,在成功的情况下,您可以使用开始索引和结束索引调用新的ajax函数。您需要定制过滤器视图或为ajax请求生成新视图(从开始索引到结束索引结果过滤)。您可以通过javascript设置ajax请求之间的超时。您还可以使用“分页”关键字搜索此类问题。Deniz KAPLAN提供的示例代码可能对您有所帮助。

    Deniz KAPLAN提供的示例代码在您的情况下不起作用,因为您使用的是Twitter API。Twitter不遵循分页过程。当要迭代的数据是固定的且不保持更新时,分页非常有用

    看看这个,看看Twitter的时间线是如何工作的

    无论如何,您需要做的是使用
    max\u id
    变量
    max_id
    基本上是您获取的最后一条tweet的id

    因此,在进行AJAX调用时,应该发送的数据是
    max\u id

    ...
    data: {'max_id': 3, 'query': 'qwerty'} //Append additional data if required.
    ...
    
    现在,确保您有另一个视图函数来处理AJAX请求。函数看起来有点像这样

    from django.utils import simplejson
    from django.http import HttpResponse
    
    def ajax_tweets(request):
        if request.method == 'GET':
            max_id = int(request.GET['max_id'])
            query = request.GET['query']
    
            ###
            # Perform API auth requirements
            ###
    
            tweets = tweepy.Cursor(api.search, q=query, max_id=max_id, count=100).items(100)
            json = simplejson.dumps(tweets)
    
            return HttpResponse(json, mimetype="application/x-javascript")
    
    现在,在AJAX调用的
    success
    函数中,浏览器将获取发送的JSON对象。然后您可以进行所需的更改

    ...
    success: function(data) {
         data = JSON.parse(data);
         //Perform DOM manipulations to append your tweets to your page
    },
    ...
    
    您可以在AJAX函数周围添加一个循环,其条件取决于您希望在页面上显示的tweet数量


    我希望这个解释能帮助你

    我原以为这个问题可以通过AJAX解决,但我对此一无所知,所以不确定。我不知道你们所说的分页是什么意思,我不想在网站上实现页面,只需要在一个页面上发布100条tweet。谢谢,我会调查的。我已经更新了我的答案。我希望这将有助于你开始。我唯一要提到的是,您可以根据AJAX结果轻松更改html页面。在AJAX的成功函数中,视图将返回过滤后的内容,您需要将新tweet附加到旧tweet的html容器中。您可以使用'div'标记来环绕所有tweet。Django还有无休止的分页库(如果您想查看:),非常好的解释,谢谢。这正是我想要的
    from django.utils import simplejson
    from django.http import HttpResponse
    
    def ajax_tweets(request):
        if request.method == 'GET':
            max_id = int(request.GET['max_id'])
            query = request.GET['query']
    
            ###
            # Perform API auth requirements
            ###
    
            tweets = tweepy.Cursor(api.search, q=query, max_id=max_id, count=100).items(100)
            json = simplejson.dumps(tweets)
    
            return HttpResponse(json, mimetype="application/x-javascript")
    
    ...
    success: function(data) {
         data = JSON.parse(data);
         //Perform DOM manipulations to append your tweets to your page
    },
    ...