tweetcast object
authorRaphael Velt <raph.velt@gmail.com>
Mon, 19 Dec 2011 15:22:07 +0100
changeset 450 c964d7e6556e
parent 444 3774706bfb80
child 451 c223cae8db5b
tweetcast object
tweetcast/server-gevent/tweetcast.py
--- 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