我正在使用Flask和Tweepy来搜索实时推文。在前端,我有一个用户文本输入框和一个名为“搜索”的按钮。理想情况下,当用户在输入框中输入搜索词并单击“搜索”按钮时,Tweepy应该侦听新的搜索词并停止先前的搜索流。当单击“搜索”按钮时,执行以下函数:
@app.route('/search', methods=['POST'])
# gets search-keyword and starts stream
def streamTweets():
search_term = request.form['tweet']
search_term_hashtag = '#' + search_term
# instantiate listener
listener = StdOutListener()
# stream object uses listener we instantiated above to listen for data
stream = tweepy.Stream(auth, listener)
if stream is not None:
print "Stream disconnected..."
stream.disconnect()
stream.filter(track=[search_term or search_term_hashtag], async=True)
redirect('/stream') # execute '/stream' sse
return render_template('index.html')
上面代码中倒数第二行执行的
/stream
路由如下:@app.route('/stream')
def stream():
# we will use Pub/Sub process to send real-time tweets to client
def event_stream():
# instantiate pubsub
pubsub = red.pubsub()
# subscribe to tweet_stream channel
pubsub.subscribe('tweet_stream')
# initiate server-sent events on messages pushed to channel
for message in pubsub.listen():
yield 'data: %s\n\n' % message['data']
return Response(stream_with_context(event_stream()), mimetype="text/event-stream")
我的代码可以正常工作,也就是说,每当“搜索”按钮被点击时,它会启动一个新的流并搜索给定的术语,但它不会停止前一次搜索。例如,如果我的第一个搜索词是“NYC”,然后我想搜索另一个词,比如“洛杉矶”,它将为我提供“NYC”和“洛杉矶”的结果,这不是我想要的。我只想搜索“洛杉矶”。如何解决这个问题?换句话说,我如何停止以前的流?我查看了其他线程,并知道我必须使用stream.disconnect()
,但我不确定如何在我的代码中实现这一点。任何帮助或意见都将非常感激。非常感谢!
stream
)保留为引用,这样你就可以在tweetStream()
函数中路由到\search
之前首先调用.disconnect
方法,然后再创建新的流对象吗?我没有使用过Flask,所以不知道这是否是标准模式,但它似乎应该可以工作。 - J Richard Snapeobject
的引用?怎么做呢?您能回答一下,这样我们可以进一步讨论。 - Raja Simonredis.pubsub()
模型的专家,因此需要一些时间来找出最佳/预期的方法来实现这一点。 - J Richard Snape