按钮单击停止stream.filter()

时间:2015-02-24 10:57:38

标签: python flask tweepy

我使用tweepy来传输推文并将其存储在一个文件中。我正在使用python和flask。只需单击一个按钮,流就会开始获取推文。我想要的是,只需点击一下按钮就可以停止流。 我知道与计数器变量相关的答案,但我不想要获取特定数量的推文。

提前致谢

def fetch_tweet():
    page_type = "got"



    lang_list = request.form.getlist('lang') 

    print lang_list
    #return render_template("index.html",lang_list=lang_list,page_type=page_type)
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    stream = Stream(auth, l)

    with open('hashtags.txt') as hf:
        hashtag = [line.strip() for line in hf]
        print hashtag

    print request.form.getlist('fetchbtn')
    if (request.form.getlist('stopbtn')) == ['stop']:
        print "inside stop"
        stream.disconnect()
        return render_template("analyse.html")
    elif (request.form.getlist('fetchbtn')) == ['fetch']:
        stream.filter(track=lang_list, async=True)
        return render_template("fetching.html")

1 个答案:

答案 0 :(得分:3)

所以我假设你的初始按钮链接到初始化一个tweepy流(即调用stream.filter())。

如果您要在发送推文时允许您的应用程序运行,您需要收集推文异步(线程)。否则,一旦你打电话给stream.filter(),它会在你收集推文时锁定你的程序,直到它达到你提供它的某个条件或者你输出等等。

要利用tweepy内置的线程,您只需将async参数添加到流初始化中,如下所示:

stream.filter(track=['your_terms'], async=True)

这会线程化您的推文集合并允许您的应用程序继续运行。

最后,要停止推文收集,请将烧瓶调用链接到在disconnect()对象上调用stream的函数,如下所示:

stream.disconnect()

这将断开您的流并停止推文收集。 Here是面向对象设计中这种精确方法的一个示例(请参阅gather()对象中的stop()Pyckaxe方法。


编辑 - 好的,我现在可以看到您的问题,但我会将原来的答案留给可能会发现此问题的其他人。您的问题是创建stream对象的位置。

每次通过flask调用fetch_tweet()时,您正在创建一个新的stream对象,因此当您第一次调用它时,它会创建一个初始对象,但第二次它在不同的流对象上调用disconnect()。创建流的单个实例将解决问题:

l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)

def fetch_tweet():
    with open('hashtags.txt') as hf:
        hashtag = [line.strip() for line in hf]
        print hashtag

    print request.form.getlist('fetchbtn')
    if (request.form.getlist('stopbtn')) == ['stop']:
        print "inside stop"
        stream.disconnect()
        return render_template("analyse.html")
    elif (request.form.getlist('fetchbtn')) == ['fetch']:
        stream.filter(track=lang_list, async=True)
        return render_template("fetching.html")

长话短说,您需要在stream之外创建<{1}}对象 。祝你好运!