tweetcast/server/tweetcast-gevent.py
author Raphael Velt <raph.velt@gmail.com>
Mon, 10 Oct 2011 11:54:08 +0200
changeset 307 6872c6aac6d6
child 309 e26d4354b578
permissions -rwxr-xr-x
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets

#!/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 ['<h1>Not Found</h1>']

tc = TweetCast()
WSGIServer(('', 8000), tc.webserver).serve_forever()