Я использую 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()
, но я не уверен, как реализовать это в своем коде. Любая помощь или ввод были бы весьма полезными. Большое спасибо!