赞
踩
一、 基本操作 /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
# 基本 {{ 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) %}
1. super按照顺序查找
super(类名,self).方法名()
super().方法名()
super(A,self).f1() # 执行C的方法
B.f1(self) # 执行B的方法
2. self永远是调用方法的对象
二、自定义开源组件 /easy/app02.py
自定义Session:
1.生成随机字符串
2.写入用户cookie
3.后台存储
因为需要通过self.session['key']取值
一共有两种方法:字典、类的__setitem__
三、websocket /websocket
- 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. 客户端接收到加密的值,验证;
- 进行收发数据(*为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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。