@@ -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