Python 如何使Django模板呈现来自视图的一组结果,并在不刷新页面的情况下不断调用视图以获取更多结果
我正在制作一个twitter应用程序,它基于搜索查询从twitter REST API获取推文。现在根据这些结果,我只想在前端显示那些转发次数超过2次的推文。在我的查询中,每100条tweet中只有几条满足这一标准。所以要显示100条这样的推文,其中有2条以上的转发,我必须处理5-10k条推文。但一次API调用最多可以获取100条推文 现在,如果我在我的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模板(或者我只是将
views.py
中获取5-10k条tweets,对它们进行处理,提取我需要的tweets,然后将其作为上下文传递给django模板(或者我只是将api结果原样传递给模板,只显示符合条件的tweets),-然后,它显然无法工作,因为用户不能等待网站加载,直到所有推文都处理完毕。通常会发生超时
那么,我有没有办法:
views.py
在后台运行api调用,并在不刷新页面的情况下,继续呈现满足模板上当前结果集下条件的推文或者有没有一种方法可以从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
},
...