tornado websocket编程(1) 初识websocket ——简单购物车实现

4 篇文章 0 订阅
3 篇文章 0 订阅

tornado websocket编程 : 初识websocket ——简单购物车实

完整代码:https://github.com/wskssau/my_notespace/tree/master/python/tornado_exercise
WebSocket相关资料,第一次听过websocket的童鞋可以阅读下
1. wiki: https://zh.wikipedia.org/wiki/WebSocket#.E5.8E.9F.E7.90.86
2. MDN: https://developer.mozilla.org/zh-CN/docs/WebSockets/Writing_WebSocket_servers
3. 知乎讨论: https://www.zhihu.com/topic/19657811/hot

  • app.py 基本结构(或者说是一个手脚架吧,一步一步的添加我们需要的功能)
#!/usr/bin/env python
# -*-coding:utf-8-*-

import os.path

import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.options


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
        ]

        settings = {
            'debug': True,
            'template_path': os.path.join(os.path.dirname(__file__),
                                          'templates'),
            'static_path': os.path.join(os.path.dirname(__file__),
                                        'static')
        }

        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == '__main__':
    tornado.options.parse_command_line()

    app = Application()
    server = tornado.httpserver.HTTPServer(app)
    server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

重写tornado.web.Application用以添加一个全局的Cart类实例
Cart类则以观察者模式用来注册每个websocket连接

  • websocket handler 原型
class CartStatusHandler(tornado.1websocket.WebSocketHandler):
    def open(self):
        pass

    def on_close(self):
        pass

    def on_message(self, message):
        pass


- 编写Cart类原型,用来注册websocket连接,
通过迭代已注册的连接列表中的回调函数向客户端返回消息

class Cart(object):
    callbacks = []

    def __init__(self):
        self.__total = 100

    def register(self, callback):
        self.callbacks.append(callback)

    def unregister(self, callback):
        self.callbacks.remove(callback)

    @property
    def total(self):
        return self.__total

    def notify(self):
        for callback in self.callbacks:
            callback(self.__total)


- 在Application类中添加一个全局Cart实例

class Application(tornado.web.Application):
    def __init__(self):

        self.cart = Cart()

        handlers = [
        ]

        settings = {
            'debug': True,
            'template_path': os.path.join(os.path.dirname(__file__),
                                          'templates'),
            'static_path': os.path.join(os.path.dirname(__file__),
                                        'static')
        }

        tornado.web.Application.__init__(self, handlers, **settings)
  • 修改CartStatusHandler类
    WebSocket连接关联到Cart: 注册、取消注册以及消息推送回调函数
class CartStatusHandler(tornado.1websocket.WebSocketHandler):
    def open(self):
        self.application.cart.register(self.callback)

    def on_close(self):
        self.application.cart.unregister(self.callback)

    def on_message(self, message):
        pass

    def callback(self, count):
        self.write_message('{"count" :%d}' %count)

到这一步基本websocket后端逻辑实现了
现在开始准备一个前后端通信的场景

  • 实现Cart Index
class Index(tornado.web.RequestHandler):
    def get(self):
        context = {
            'total': self.application.cart.total
        }
        self.render('cart.html', **context)

    def post(self):
        action = self.get_argument('action')

        if action == 'add':
            self.add_order()
        elif action == 'remove':
            self.cancel_order()
        else:
            self.set_status(400)

    def add_order(self):
        self.application.cart.add_order()
        self.write('success')

    def cancel_order(self):
        self.application.cart.cancel_order()
        self.write('success')
  • 前端准备
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <p>Test websocket</p>
    <script src="http://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script>
    <script src="/static/built/ex1_websocket.js"></script>
</body>
</html>
js
$(function() {
    var goodsClient = new WebSocket('ws://127.0.0.1:8000/websocket_goods');

    goodsClient.onopen = function(e) {
        console.log('connected');
    }

    goodsClient.onmessage = function(e) {
        // 接受websocket消息
        var data = null,
            message  = { data: data };

        try {
            message.data = JSON.parse(evt.data);
        } catch (e) {
            message.data = evt;
        }

        $("#total").text(message.data.count);
    }

    $("button#add").on("click", function () {
        //添加货物
        $.ajax({
            'url': '/',
            'type': 'POST',
            'dataType': 'json',
            'data': { 'action': 'add' }
        });
    });


    $("button#del").on("click", function () {
        //取消添加
        $.ajax({
            'url': '/',
            'type': 'POST',
            'dataType': 'json',
            'data': { 'action': 'remove' }
        });
    });
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值