tornado-websocket-异步非阻塞

一、 基本操作 /easy/app.py

  • 路由系统
class LoginHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
       ***
    def post(self, *args, **kwargs):
       ***
# 配置文件
settings = {
    "template_path": 'template',
    'static_path': 'static',
}
       
# 设置view和url路径匹配
# url -> 类(根据method执行方法)
application = tornado.web.Application([
    (r"/login", LoginHandler),
],**settings)

application.listen(8888) # 监听8888端口
tornado.ioloop.IOLoop.instance().start() # 开启服务
  • 控制器
def get(self):
    self.render('login.html',msg= "") # 必须传参数
    self.write("Hello, world") # 返回字符串
    self.redirect('http://www.baidu.com') # 重定向
    self.get_argument() # 在url或body中都可取
    self.get_arguments()
    self.get_cookie()
    self.set_cookie()
    self.get_secure_cookie('mmmmm')
    self.set_secure_cookie('mmmmm','wwwww') # 设置签名cookie
    # PS: 加密cookie依赖配置文件 cookie_secret
    self.request.files['fafafa'] # 取文件
    self._headers # 拿到请求头

def post(self):
    pass
  • 模板引擎(更接近Python)
# 基本  
{{ li[0] }}
{% for i in range(10) %}
{% end %}

# 在模板中自定制方法,在setting中注册,添加内容
def tab(request,val):
    # 会自动传递请求相关信息 request
    return '<h1>hello world</h1>'

# 在模板中自定制模块,可添加CSS,JS,内容
class Custom(UIModule):
    def css_files(self):
        return "commons.css" # 在head中引入静态文件
    def embedded_css(self): # 在head中嵌入css
        return ".c1{display:none}"
    def javascript_files(self): # 在body的最下面引入js文件/static/commons.js
        return "commons.js"
    def embedded_javascript(self): # 引入js代码
        return "function f1(){alert(123);}"
    def render(self, val): # 前端可以看见的函数
        # return "hello"
        # return '<h1>hello</h1>' # 本身就不会自动转义 前端显示h1标签的hello
        v = escape.xhtml_escape('<h1>hello</h1>') # 手动转义 前端显示字符串'<h1>hello</h1>'
        return v

前端使用
<!-- 使用UIMethod的tab函数 -->
{{ tab(11) }}
<!-- 使用UIModule -->
{% module Custom(22) %}
  • 单继承和多继承 /easy/app01.py
  • 类的继承 /easy/test_test.py
1. super按照顺序查找
   super(类名,self).方法名()
   super().方法名()
   super(A,self).f1() # 执行C的方法
   B.f1(self) # 执行B的方法
2. self永远是调用方法的对象

二、自定义开源组件 /easy/app02.py

  • Session
自定义Session:
1.生成随机字符串
2.写入用户cookie
3.后台存储
因为需要通过self.session['key']取值
一共有两种方法:字典、类的__setitem__

三、websocket /websocket

  • Http, 通过socket实现,单工通道,请求响应, 短链接,连接发送数据后就断开。
  • WebSocket,通过 socket实现,双工通道,请求响应+服务端向客户端推送 ,Socket创建连接,不断开。

- websocket入手

  • 服务端(socket服务端)
    1. 服务端开启socket,监听IP和端口;
    3. 服务端允许客户端连接;
    *5. 服务端接收到xxx,对其签名[sha1,xxx,migic string=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”] migic string固定不变;
    *6. 加密后的值发送给客户端;
  • 客户端(浏览器)
    2. 客户端发起连接请求(IP和端口);
    *4. 客户端生成一个随机字符串xxx,向服务端发送xxx;
    *7. 客户端接收到加密的值,验证;
  1. 进行收发数据(*为websocket特有协议)

- 客户端

ws = new WebSocket("ws://127.0.0.1:8002"); // 创建连接
ws.onopen = function () {
   //客户端发送消息
};
ws.onmessage = function (event) {
   //客户端接收消息
};
ws.onclose = function () { 
   //服务端断开时执行
};
# 服务端接收和发送均有一定的规则
# 确定头部信息和mask-4字节以及数据的界限
# websocket返回消息的比特规则 https://www.cnblogs.com/lsdb/p/10949766.html

四、实现websocket聊天室 /webchat

# WebSocket请求继承tornado.websocket.WebSocketHandler
class ChatHandler(tornado.websocket.WebSocketHandler):
    def open(self, *args, **kwargs):
        """
        客户端和服务端已经建立连接 tornado建立的 打开http://127.0.0.1:8888/自动执行
        1. 连接
        2. 握手
        """
    # 前端sendMessage()发消息 后台收消息message
    def on_message(self, message):
    	pass
    def on_close(self):
        """
        客户端主动关闭连接时执行
        """

五、支持异步非阻塞Web框架 /io

计算型-cpu型的任务只能轮询 因为只有一个cpu
io型的可以异步非阻塞实现
应用场景:
客户端向服务端发送请求,但是服务端处理不了,所以向别人发送请求。并等待别人处理完成后,发送结果给客户端,但是服务端现在空闲。此时异步阻塞。
支持异步非阻塞Web框架 - Tornado,Nodejs

- 异步非阻塞可以分为3种情况:

请求先来 等5s处理 期间可以处理其他请求 s2.py future

	@gen.coroutine
    def get(self):
        # 特殊的形式等待5s 5s后处理self.done
        future = Future()
        tornado.ioloop.IOLoop.current().add_timeout(time.time() + 5, self.done)
        yield future # 监听返回的future里的result有没有值 如果没有,监听就不断开
        # 5s后值返回了 检测到有值,执行done函数断开连接

    def done(self, *args, **kwargs):
        self.write('Main')
        self.finish()

请求发送给别人 等待返回后终止 期间可以处理其他请求 s4.py httpclient

	@gen.coroutine
    def get(self):
        from tornado import httpclient
        http = httpclient.AsyncHTTPClient() # 收到结果 执行self.done
        yield http.fetch("http://www.google.com", self.done)

    def done(self, *args, **kwargs):
        self.write('Main')
        self.finish() # 断开连接

请求来了永远等待 某一时刻主动设置 期间可以处理其他请求 s5.py

future.set_result(None) # 设置future的值 当前请求以及由于future挂起请求 均被返回

自定义同步web框架 s6.py
自定义异步非阻塞web框架 s7.py
完整项目:https://github.com/zxy1013/tornado

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值