基于Server-Sent Event的简单在线聊天室

#!/usr/bin/env python    
import datetime    
import flask    
import redis 
   
app = flask.Flask(__name__)    
app.secret_key = 'asdf'    
red = redis.StrictRedis(host='localhost', port=6379, db=6)    

def event_stream():    
pubsub = red.pubsub()    
pubsub.subscribe('chat')    
# TODO: handle client disconnection.    
for message in pubsub.listen():    
print message    
yield 'data: %s\n\n' % message['data']    

@app.route('/login', methods=['GET', 'POST'])    
def login():    
if flask.request.method == 'POST':    
flask.session['user'] = flask.request.form['user']    
return flask.redirect('/')    
return '<form action="" method="post">user: <input name="user">'    

@app.route('/post', methods=['POST'])    
def post():    
message = flask.request.form['message']    
user = flask.session.get('user', 'anonymous')    
now = datetime.datetime.now().replace(microsecond=0).time()    
red.publish('chat', u'[%s] %s: %s' % (now.isoformat(), user, message))    
return flask.Response(status=204)    

@app.route('/stream')    
def stream():    
return flask.Response(event_stream(),    
mimetype="text/event-stream")    

@app.route('/')    
def home():    
if 'user' not in flask.session:    
return flask.redirect('/login')    
return u"""    
        <!doctype html>    
        <title>chat</title>    
        <script src="http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>    

        <style>body { max-width: 500px; margin: auto; padding: 
1em; background: black; color: #fff; font: 16px/1.6 menlo, monospace; 
}</style>    
        <p><b>hi, %s!</b></p>    
        <p>Message: <input id="in" /></p>    
        <pre id="out"></pre>    
        <script>    
            function sse() {    
                var source = new EventSource('/stream');    
                var out = document.getElementById('out');    
                source.onmessage = function(e) {    
                    // XSS in chat is fun    
                    out.innerHTML =  e.data + '\\n' + out.innerHTML;    
                };    
            }    
            $('#in').keyup(function(e){    
                if (e.keyCode == 13) {    
                    $.post('/post', {'message': $(this).val()});    
                    $(this).val('');    
                }    
            });    
            sse();    
        </script>    
   
 """ % flask.session['user']    

if __name__ == '__main__':    
app.debug = True    
app.run(host='0.0.0.0', port=8989, threaded=True)    
Status
API
Training
Shop
Blog
About

      
    

    
© 2014 GitHub, Inc.
Terms
Privacy
Security
Contact

安装运行后,以下为效果图:基于Server-Sent Event的简单在线聊天室

详细内容和讲解请登录实验楼官方网站:http://www.shiyanlou.com/courses/81

你可能感兴趣的:(python,服务器,电子商务,在线聊天室,SSR,web即时通信)