├── .gitignore ├── README ├── __init__.py ├── app.py └── templates ├── choose.html ├── main.html └── room.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | *.swp 4 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | A simple python chat app (demo) writtern with flask and gevent. 2 | 3 | To use it: 4 | `sudo apt-get install libev-dev libevent-dev python-all-dev -y` 5 | `pip install gevent flask` 6 | `python app.py` 7 | ... and go to http://127.0.0.1:5000 to use it. 8 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdiehl/minichat/b35d99b0bcba3883f3bc78b415333a3c10be41f0/__init__.py -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # Micro gevent chatroom. 2 | # ---------------------- 3 | # Make things as simple as possible, but not simpler. 4 | from gevent import monkey; monkey.patch_all() 5 | from flask import Flask, render_template, request, json 6 | 7 | from gevent import queue 8 | from gevent.pywsgi import WSGIServer 9 | 10 | app = Flask(__name__) 11 | app.debug = True 12 | 13 | class Room(object): 14 | 15 | def __init__(self): 16 | self.users = set() 17 | self.messages = [] 18 | 19 | def backlog(self, size=25): 20 | return self.messages[-size:] 21 | 22 | def subscribe(self, user): 23 | self.users.add(user) 24 | 25 | def add(self, message): 26 | for user in self.users: 27 | print user 28 | user.queue.put_nowait(message) 29 | self.messages.append(message) 30 | 31 | class User(object): 32 | 33 | def __init__(self): 34 | self.queue = queue.Queue() 35 | 36 | rooms = { 37 | 'python': Room(), 38 | 'django': Room(), 39 | } 40 | 41 | users = {} 42 | 43 | @app.route('/') 44 | def choose_name(): 45 | return render_template('choose.html') 46 | 47 | @app.route('/') 48 | def main(uid): 49 | return render_template('main.html', 50 | uid=uid, 51 | rooms=rooms.keys() 52 | ) 53 | 54 | @app.route('//') 55 | def join(room, uid): 56 | user = users.get(uid, None) 57 | 58 | if not user: 59 | users[uid] = user = User() 60 | 61 | active_room = rooms[room] 62 | active_room.subscribe(user) 63 | print 'subscribe', active_room, user 64 | 65 | messages = active_room.backlog() 66 | 67 | return render_template('room.html', 68 | room=room, uid=uid, messages=messages) 69 | 70 | @app.route("/put//", methods=["POST"]) 71 | def put(room, uid): 72 | user = users[uid] 73 | room = rooms[room] 74 | 75 | message = request.form['message'] 76 | room.add(':'.join([uid, message])) 77 | 78 | return '' 79 | 80 | @app.route("/poll/", methods=["POST"]) 81 | def poll(uid): 82 | try: 83 | msg = users[uid].queue.get(timeout=10) 84 | except queue.Empty: 85 | msg = [] 86 | return json.dumps(msg) 87 | 88 | if __name__ == "__main__": 89 | http = WSGIServer(('', 5000), app) 90 | http.serve_forever() 91 | -------------------------------------------------------------------------------- /templates/choose.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Main 6 | 7 | 8 | 16 | 17 | 18 | Choose Name: 19 |
20 | 21 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /templates/main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Main 6 | 8 | 9 | 10 | Rooms: 11 |
    12 | {% for room in rooms %} 13 |
  • {{room}}
  • 14 | {% endfor %} 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /templates/room.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Main 6 | 7 | 8 | 45 | 46 | 47 | Messages: 48 |
    49 | {% for message in messages %} 50 |
  • {{message}}
  • 51 | {% endfor %} 52 |
53 |
54 | 55 | 56 |
57 | 58 | 59 | 60 | --------------------------------------------------------------------------------