Skip to content

Commit 63692ee

Browse files
committed
Added chat room example.
1 parent c79d296 commit 63692ee

1 file changed

Lines changed: 104 additions & 0 deletions

File tree

index.html

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,110 @@ <h3>Long Polling</h3>
975975

976976
<section>
977977
<h3>Chat Server</h3>
978+
979+
<p>
980+
The final motivating example, a realtime chat room. This example
981+
requires <a href="http://flask.pocoo.org/">Flask</a> ( but not neccesarily so, you could use Django,
982+
Pyramid, etc ). The corresponding Javascript and HTML files can
983+
be found <a href="https://github.com/sdiehl/minichat">here</a>.
984+
</p>
985+
986+
987+
<pre>
988+
<code class="python"># Micro gevent chatroom.
989+
# ----------------------
990+
991+
from flask import Flask, render_template, request
992+
993+
from gevent import queue
994+
from gevent.pywsgi import WSGIServer
995+
996+
import simplejson as json
997+
998+
app = Flask(__name__)
999+
app.debug = True
1000+
1001+
class Room(object):
1002+
1003+
def __init__(self):
1004+
self.users = set()
1005+
self.messages = []
1006+
1007+
def backlog(self, size=25):
1008+
return self.messages[-size:]
1009+
1010+
def subscribe(self, user):
1011+
self.users.add(user)
1012+
1013+
def add(self, message):
1014+
for user in self.users:
1015+
print user
1016+
user.queue.put_nowait(message)
1017+
self.messages.append(message)
1018+
1019+
class User(object):
1020+
1021+
def __init__(self):
1022+
self.queue = queue.Queue()
1023+
1024+
rooms = {
1025+
'python': Room(),
1026+
'django': Room(),
1027+
}
1028+
1029+
users = {}
1030+
1031+
@app.route('/')
1032+
def choose_name():
1033+
return render_template('choose.html')
1034+
1035+
@app.route('/<uid>')
1036+
def main(uid):
1037+
return render_template('main.html',
1038+
uid=uid,
1039+
rooms=rooms.keys()
1040+
)
1041+
1042+
@app.route('/<room>/<uid>')
1043+
def join(room, uid):
1044+
user = users.get(uid, None)
1045+
1046+
if not user:
1047+
users[uid] = user = User()
1048+
1049+
active_room = rooms[room]
1050+
active_room.subscribe(user)
1051+
print 'subscribe', active_room, user
1052+
1053+
messages = active_room.backlog()
1054+
1055+
return render_template('room.html',
1056+
room=room, uid=uid, messages=messages)
1057+
1058+
@app.route("/put/<room>/<uid>", methods=["POST"])
1059+
def put(room, uid):
1060+
user = users[uid]
1061+
room = rooms[room]
1062+
1063+
message = request.form['message']
1064+
room.add(':'.join([uid, message]))
1065+
1066+
return ''
1067+
1068+
@app.route("/poll/<uid>", methods=["POST"])
1069+
def poll(uid):
1070+
try:
1071+
msg = users[uid].queue.get(timeout=10)
1072+
except queue.Empty:
1073+
msg = []
1074+
return json.dumps(msg)
1075+
1076+
if __name__ == "__main__":
1077+
http = WSGIServer(('', 5000), app)
1078+
http.serve_forever()
1079+
</code>
1080+
</pre>
1081+
9781082
</section>
9791083

9801084
</section>

0 commit comments

Comments
 (0)