1

I'm trying to return to the client a stream of twitter metadata which the client enters in a form filtered by tweepy's 'track'.

The problem I'm having is that nothing is returned back to the browser, eventhough the server receives it and processes the request. This is my code so far:

The main.py:

import flask
from flask.views import MethodView
from tweetStreamsRT import StreamerRt


app = flask.Flask(__name__)
app.secret_key = "asecret"

class View(MethodView):

def get(self):
    return flask.render_template('index.html')

def post(self):
    results = StreamerRt().filter(track = (flask.request.form['event']))
    flask.flash(results)
    return self.get()

 app.add_url_rule('/', view_func = View.as_view('index'), methods=['GET', 'POST'])
 app.debug = True
 app.run()

The class connecting to the Twitter Streaming API:

import sys
import tweepy
import json
import time
#from textwrap import TextWrapper
import pymongo

CONSUMER_KEY = ''
CONSUMER_SECRET = ''

ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''

auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET)


connection = pymongo.Connection()  
db = connection.twitterStream

class Listener(tweepy.StreamListener):


    def on_status(self, status):
        message = {}

        if status.author.lang == 'en':
            try:
                message = {
                           'Author': status.author.screen_name,
                           'Author_id': status.id,
                           'Time_normal': str(status.created_at),
                           'geo_enabled': status.author.geo_enabled,
                           'Geo': status.geo,
                           'Place' : status.place,
                           'Coordinates': status.coordinates}

                db.tweetStream.insert(message)


            except Exception, e:
                print >> sys.stderr, 'Encountered Exception:', e
                pass

        def on_error(self, status_code):

            waitPeriod = 60
            if status_code == 420:
                print >> sys.stderr, 'Encountered a %i Error, will retry in %i minutes'     % \
                (status_code, waitPeriod/60)
                time.sleep(waitPeriod)
                waitPeriod *= 2
                return waitPeriod
            else:            
                print >> sys.stderr, 'Encountered error with status code:', status_code
                return True 

        def on_timeout(self):
            print >> sys.stderr, 'Timeout...'
            return True 

def StreamerRt():
    return tweepy.streaming.Stream(auth, Listener(), timeout=60)

My html file which inherits from a base and forms html file:

{% extends "base.html" %}
{% import "forms.html" as forms %}


{% block page_header %}
  <div class="page-header">
    <h1>Welcome</h1>
  </div>
{% endblock %}
{% block content %}
  <h2>Enter the Event you would like to follow</h2>
      <form action="/" method="post">
            <input type="text" name="event" />
            <input type="submit" value="Submit Query" />
          </form>
        {% with messages = get_flashed_messages() %}
    {% if messages %}
                Results:
                <pre>
                    {% for message in messages %}
{{ message }}
                    {% endfor %}
                  </pre>
               {% endif %}
             {% endwith %}        
           {% endblock %}

It seems that I can't return any streaming data to the client.

How could you return certain metadata from Twitter Streaming API to the browser, at the same time that it is written into the DB.

Thanks

Furthermore the function StreamerRt doesnt filter by track as input from the client, but seems to return the whole public timeline.

user94628
  • 3,641
  • 17
  • 51
  • 88

1 Answers1

1

I think Flask-Sijax is what you are looking for. Hookbox is another option, here is a tutorial on how to integrate hookbox with flask. Yet another option is gevent here is a SO post on using gevent with flask. Last one I can think of is tornado.

Community
  • 1
  • 1
John
  • 13,197
  • 7
  • 51
  • 101
  • Thanks, I'm trying to do it using juggernaut from the flask snippet example: http://stackoverflow.com/questions/13038376/python-flask-send-real-time-data-to-client Still nothing is sent to the client# – user94628 Oct 23 '12 at 20:27