| 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 |
|
307
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
2 |
# -*- coding: utf-8 -*- |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
3 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
4 |
from gevent import monkey; monkey.patch_all() |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
5 |
# Importer d'abord, sinon exception |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
6 |
import anyjson, gevent, psycopg2 |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
7 |
from sqlalchemy import (Boolean, Column, BigInteger, Integer, String, |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
8 |
ForeignKey, DateTime, create_engine, func) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
9 |
from sqlalchemy.orm import relationship, sessionmaker |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
10 |
from sqlalchemy.ext.declarative import declarative_base |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
11 |
from gevent.pywsgi import WSGIServer |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
12 |
from urlparse import parse_qs |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
13 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
14 |
Base = declarative_base() |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
15 |
engine = create_engine('postgresql://postgres:doiteshimashite@localhost/tweet_live') |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
16 |
Session = sessionmaker(bind=engine) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
17 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
18 |
class Tweet(Base): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
19 |
__tablename__ = 'tweet_tweet' |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
20 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
21 |
id = Column(BigInteger, primary_key=True, autoincrement=False) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
22 |
created_at = Column(DateTime) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
23 |
text = Column(String) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
24 |
user_id = Column(Integer, ForeignKey('tweet_user.id')) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
25 |
user = relationship("User", backref="tweets") |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
26 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
27 |
def __repr__(self): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
28 |
return anyjson.serialize({ |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
29 |
"id" : str(self.id), |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
30 |
"created_at" : str(self.created_at), |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
31 |
"text" : self.text, |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
32 |
"user_id" : self.user_id, |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
33 |
"screen_name" : self.user.screen_name |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
34 |
}) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
35 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
36 |
class User(Base): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
37 |
__tablename__ = "tweet_user" |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
38 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
39 |
id = Column(BigInteger, primary_key=True, autoincrement=False) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
40 |
created_at = Column(DateTime) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
41 |
screen_name = Column(String, index=True) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
42 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
43 |
class TweetCast(object): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
44 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
45 |
def __init__(self): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
46 |
self.session = Session() |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
47 |
a = self.session.query(func.max(Tweet.id)) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
48 |
self.lastid = long(a[0][0]) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
49 |
print self.lastid |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
50 |
self.tweets = [] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
51 |
self.clients = [] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
52 |
self.clientpos = [] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
53 |
print "__init__" |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
54 |
gevent.spawn_later(1,self.getLastTweets) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
55 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
56 |
def getLastTweets(self): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
57 |
result = self.session.query(Tweet).filter(Tweet.id > self.lastid).all() |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
58 |
if result: |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
59 |
self.lastid = result[len(result)-1].id |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
60 |
for tweet in result: |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
61 |
self.tweets.append(tweet) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
62 |
print "getLastTweets - LastId = %d"%self.lastid |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
63 |
gevent.spawn_later(1,self.getLastTweets) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
64 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
65 |
def webserver(self, env, start_response): |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
66 |
print env |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
67 |
if env['PATH_INFO'] == '/': |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
68 |
query = parse_qs(env['QUERY_STRING']) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
69 |
start_response('200 OK', [('Content-Type', 'text/html')]) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
70 |
cookie = env['HTTP_COOKIE'] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
71 |
if cookie not in self.clients: |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
72 |
self.clients.append(cookie) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
73 |
self.clientpos.append(0) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
74 |
clientid = self.clients.index(cookie) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
75 |
pos = self.clientpos[clientid] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
76 |
self.clientpos[clientid] = len(self.tweets) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
77 |
return ["%s[%s]%s"%( |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
78 |
"%s("%query["callback"][0] if "callback" in query else "", |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
79 |
",".join([str(tweet) for tweet in self.tweets[pos:]]), |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
80 |
")" if "callback" in query else "" |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
81 |
)] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
82 |
else: |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
83 |
start_response('404 Not Found', [('Content-Type', 'text/html')]) |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
84 |
return ['<h1>Not Found</h1>'] |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
85 |
|
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
86 |
tc = TweetCast() |
|
6872c6aac6d6
Tests de Tweetcast avec GEvent et SQL Alchemy, sans websockets
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
87 |
WSGIServer(('', 8000), tc.webserver).serve_forever() |