--- a/tweetcast/server-gevent/tweetcast.py Mon Dec 19 11:37:16 2011 +0100
+++ b/tweetcast/server-gevent/tweetcast.py Mon Dec 19 15:22:07 2011 +0100
@@ -16,8 +16,6 @@
Base = declarative_base()
engine = create_engine(SQL_CONNECT)
Session = sessionmaker(bind=engine)
-data = []
-lastid = 0L
class TweetSource(Base):
__tablename__ = 'tweet_tweet_source'
@@ -108,42 +106,45 @@
textids(tweetdict['retweeted_status'])
return tweetdict
-def refresh():
- global lastid, data
- print "refreshing"
- query = session.query(Tweet).order_by(asc(Tweet.id)).options(joinedload(Tweet.tweet_source)).filter(Tweet.id > lastid)
- for tweet in query:
- lastid = tweet.id
- data.append(anyjson.serialize(tweet.jsondict()))
- gevent.sleep(2.)
- gevent.spawn(refresh)
+class Tweetcast():
-def wsstart():
- global WEB_PORT
- WSGIServer(('', WEB_PORT), webserver).serve_forever()
+ def __init__(self, port):
+ print "Starting server"
+ self.data = []
+ self.lastid = 0L
+ self.session = Session()
+ self.refresh()
+ WSGIServer(('', port), self.webserver).serve_forever()
+
+ def refresh(self):
+ print "refreshing"
+ query = self.session.query(Tweet).order_by(asc(Tweet.id)).options(joinedload(Tweet.tweet_source)).filter(Tweet.id > self.lastid)
+ for tweet in query:
+ self.lastid = tweet.id
+ self.data.append(anyjson.serialize(tweet.jsondict()))
+ print len(self.data), "tweets in memory"
+ self.lastrefresh = datetime.datetime.now()
-def webserver(env, start_response):
- if env['PATH_INFO'] == '/':
- httpquery = parse_qs(env['QUERY_STRING'])
- print "serving tweets to", env['REMOTE_ADDR'], httpquery
- frompos = 0
- if "from" in httpquery:
- frompos = int(httpquery["from"][0])
- result = '%s{"tweets" : [ %s ] }%s'%(
- "%s("%httpquery["callback"][0] if "callback" in httpquery else "",
- ",".join(data[frompos:]),
- ")" if "callback" in httpquery else ""
- )
- print "Sending response"
- start_response('200 OK', [('Content-Type', 'application/javascript' if "callback" in httpquery else 'application/json' )])
- return [result]
- else:
- start_response('404 Not Found', [('Content-Type', 'text/html')])
- return ['<h1>Not Found</h1>']
-
-session = Session()
+ def webserver(self, env, start_response):
+ if (datetime.datetime.now() - self.lastrefresh).seconds > 10:
+ self.refresh()
+ if env['PATH_INFO'] == '/':
+ httpquery = parse_qs(env['QUERY_STRING'])
+ print "serving tweets to", env['REMOTE_ADDR'], httpquery
+ frompos = 0
+ if "from" in httpquery:
+ frompos = int(httpquery["from"][0])
+ result = '%s{"tweets" : [ %s ] }%s'%(
+ "%s("%httpquery["callback"][0] if "callback" in httpquery else "",
+ ",".join(self.data[frompos:]),
+ ")" if "callback" in httpquery else ""
+ )
+ print "Sending response"
+ start_response('200 OK', [('Content-Type', 'application/javascript' if "callback" in httpquery else 'application/json' )])
+ return [result]
+ else:
+ start_response('404 Not Found', [('Content-Type', 'text/html')])
+ return ['<h1>Not Found</h1>']
if __name__ == "__main__":
- gevent.spawn(refresh)
- print "Starting Webserver"
- wsstart()
\ No newline at end of file
+ Tweetcast(WEB_PORT)
\ No newline at end of file