# HG changeset patch # User Raphael Velt # Date 1318240448 -7200 # Node ID 6872c6aac6d6a361d3027b38fffa11fd70167ace # Parent 70c9688a14864bc5cc337c6c69000019bc1314f9 Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets diff -r 70c9688a1486 -r 6872c6aac6d6 tweetcast/server/tweetcast-gevent.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tweetcast/server/tweetcast-gevent.py Mon Oct 10 11:54:08 2011 +0200 @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from gevent import monkey; monkey.patch_all() +# Importer d'abord, sinon exception +import anyjson, gevent, psycopg2 +from sqlalchemy import (Boolean, Column, BigInteger, Integer, String, + ForeignKey, DateTime, create_engine, func) +from sqlalchemy.orm import relationship, sessionmaker +from sqlalchemy.ext.declarative import declarative_base +from gevent.pywsgi import WSGIServer +from urlparse import parse_qs + +Base = declarative_base() +engine = create_engine('postgresql://postgres:doiteshimashite@localhost/tweet_live') +Session = sessionmaker(bind=engine) + +class Tweet(Base): + __tablename__ = 'tweet_tweet' + + id = Column(BigInteger, primary_key=True, autoincrement=False) + created_at = Column(DateTime) + text = Column(String) + user_id = Column(Integer, ForeignKey('tweet_user.id')) + user = relationship("User", backref="tweets") + + def __repr__(self): + return anyjson.serialize({ + "id" : str(self.id), + "created_at" : str(self.created_at), + "text" : self.text, + "user_id" : self.user_id, + "screen_name" : self.user.screen_name + }) + +class User(Base): + __tablename__ = "tweet_user" + + id = Column(BigInteger, primary_key=True, autoincrement=False) + created_at = Column(DateTime) + screen_name = Column(String, index=True) + +class TweetCast(object): + + def __init__(self): + self.session = Session() + a = self.session.query(func.max(Tweet.id)) + self.lastid = long(a[0][0]) + print self.lastid + self.tweets = [] + self.clients = [] + self.clientpos = [] + print "__init__" + gevent.spawn_later(1,self.getLastTweets) + + def getLastTweets(self): + result = self.session.query(Tweet).filter(Tweet.id > self.lastid).all() + if result: + self.lastid = result[len(result)-1].id + for tweet in result: + self.tweets.append(tweet) + print "getLastTweets - LastId = %d"%self.lastid + gevent.spawn_later(1,self.getLastTweets) + + def webserver(self, env, start_response): + print env + if env['PATH_INFO'] == '/': + query = parse_qs(env['QUERY_STRING']) + start_response('200 OK', [('Content-Type', 'text/html')]) + cookie = env['HTTP_COOKIE'] + if cookie not in self.clients: + self.clients.append(cookie) + self.clientpos.append(0) + clientid = self.clients.index(cookie) + pos = self.clientpos[clientid] + self.clientpos[clientid] = len(self.tweets) + return ["%s[%s]%s"%( + "%s("%query["callback"][0] if "callback" in query else "", + ",".join([str(tweet) for tweet in self.tweets[pos:]]), + ")" if "callback" in query else "" + )] + else: + start_response('404 Not Found', [('Content-Type', 'text/html')]) + return ['

Not Found

'] + +tc = TweetCast() +WSGIServer(('', 8000), tc.webserver).serve_forever() \ No newline at end of file