一.Tornado 基础入门
tornado入门笔记
http://www.tornadoweb.org/en/stable/
tornado 异步非阻塞IO处理方式 后续深入在进行博客记录。
1.最简单的hello world
import tornado.ioloop
import tornado.webclass MainHandler(tornado.web.RequestHandler):def get(self):self.write("Hello, world")if __name__ == "__main__":application = tornado.web.Application([(r"/", MainHandler),])application.listen(8888)tornado.ioloop.IOLoop.current().start()
2.RequestHandler是非线程安全的
write(),finish()和 flush()只能从主线程调用。
如果使用多个线程,则必须IOLoop.add_callback 在完成请求之前将控制权转移回主线程,
或者限制使用其他线程 IOLoop.run_in_executor并确保在执行程序中运行的回调不引用Tornado对象。#大概了解说的什么,不是很懂。
3.init和 initialize
"""
tornado.web.RequestHandler
不应直接构造对象,使用继承构造我们的对象。
初始化操作 使用initialize 代替 __init__initialize子类初始化,为每一个请求调用
通过URLSpec 字典传入
"""
import tornado.ioloop
from tornado.web import RequestHandler,Applicationclass ProfileHandler(RequestHandler):def initialize(self, database):self.database = databaseprint("初始化类的时候打印,为以后的请求调用,每次请求都会调用的", self.database)# 不知道为啥 每一次请求都会调用?def get(self, username):print("get 调用", self.database)self.write(username)database = "这是database"
app = Application([(r'/user/(.*)', ProfileHandler, dict(database=database)),
])if __name__ == "__main__":app.listen(8888)tornado.ioloop.IOLoop.current().start()
4.其他的一些方法
和3中类似
RequestHandler.prepare
请求开始前调用
RequestHandler.on_finish
请求结束后调用
这两个方法是相对的。
on_finish 重写此方法以执行清理,日志记录等。
on_finish
可能不会产生任何输出,因为它是在响应发送到客户端后调用的
5.HTTP请求的方法
RequestHandler.get(* args,** kwargs )
RequestHandler.head(* args,** kwargs )
RequestHandler.post(* args,** kwargs )
RequestHandler.delete(* args,** kwargs )
RequestHandler.patch(* args,** kwargs )
RequestHandler.put(* args,** kwargs )
RequestHandler.options(* args,** kwargs ) """
如果使用的方法不在这里,可以覆盖变量,添加自己的请求方式,虽然我们基本不会这么做。class WebDAVHandler(RequestHandler):SUPPORTED_METHODS = RequestHandler.SUPPORTED_METHODS + ('PROPFIND',)def propfind(self):pass
"""
6.接收前端传来的参数
首先了解一下,传参的一些手段
- 藏在URL后面,如 http://localhost:8888/user/?key1=value1&key2=value2;
- 请求体(body)中发送的数据,比如表单数据、json、xml;
- 提取URL特定部分,URI,如/user/info/id/0001,或者,正则表达式 提取URI部分参数。
- 在http报文的头(header)中增加自定义字段。
1.http://localhost:8888/user/?key1=value1&key2=value2;
# 接收url后的参数,username字段,默认为"",strip默认True,去掉两边空白字符
username = self.get_query_argument(name, default="", strip=True)# 加了s,接收的是list,没有不设置默认值也不会报错,空列表
# http://localhost:8888/user/?key=value1&key=value2;
username = get_query_arguments('key', strip=True)
2.获取请求体信息/form表单提交
get_body_argument(name, default=_ARG_DEFAULT, strip=True)
get_body_arguments(name, strip=True)说明:
HTTP报文头Header中的"Content-Type"
为application/x-www-form-urlencoded 或 multipart/form-data。
对于请求体数据为json或xml的,无法通过这两个方法获取。
3.前面两个方法的整合
get_argument(name, default=_ARG_DEFAULT, strip=True) # 出现多个值,以最后的为准
get_arguments(name, strip=True)
4.其他请求信息
RequestHandler.request 对象存储了关于请求的相关信息,具体属性有:
- method HTTP的请求方式,如GET或POST;
- host 被请求的主机名;
- uri 请求的完整资源标示,包括路径和查询字符串;
- path 请求的路径部分;
- query 请求的查询字符串部分;
- version 使用的HTTP版本;
- headers 请求的协议头,是类字典型的对象,支持关键字索引的方式获取特定协议头信息,例如:request.headers[“Content-Type”]
- body 请求体数据;
- remote_ip 客户端的IP地址;
- files 用户上传的文件,为字典类型
5.获取json
# 获取json/xml数据(没法直接获取,需要手动获取)
print(self.request.headers.get("Content-Type")# 获取请求数据类型
json_data = self.request.body # 获取请求体
json_args = json.loads(json_data)# 将json解码
6.正则的参数
(r"/sub-city/(.+)/([a-z]+)", SubjectCityHandler), # 无名方式
(r"/sub-date/(?P<subject>.+)/(?P<date>\d+)", SubjectDateHandler), # 命名方式def get(self, date, subject)
7.响应,输出。
# write并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端
self.write('hahaha')# 当调用finish之后,请求处理完成类似于函数的return(注意:请求当中不能出现 return)
self.finish()#self.flush() 先返回缓冲区的内容,后面的运行完成后再返回
#self.flush()就是将当前输出缓冲区刷新到网页。
self.flush()#返回html页面
self.render("in_out.html")#跳转路由
self.redirect(r"/tem")#如果flush()已经被调用,则不可能发送错误,因此该方法将简单地终止响应。
#如果输出已写入但尚未刷新,则将其丢弃并替换为错误页面.
RequestHandler.send_error(status_code = 500,**kwargs)
设置响应码
RequestHandler.set_status(status_code,reason = None)参数:
status_code(int) - 响应状态码。
reason(string) - 描述状态代码的人类可读原因短语。
self.set_status(404,'error')
设置响应头
# 设置
self.set_header('hujing',18)
self.set_header('changsha','hunan')#添加
self.set_header('hujing','20') #这里只会显示hujing:20 覆盖了前面的hujing:18
self.add_header('hujing','19') 补充:
set只能是一个值,add可以多个值。# 清除响应头
self.clear_header('changsha') # 此方法只能使用set写入的响应头
具体可以看官方文档的内容
http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.prepare
8.websocket
# coding:utf-8
"""
简单的聊天室后台
前端请使用网页工具,如
http://www.blue-zero.com/WebSocket/
"""
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import os
import datetimefrom tornado.web import RequestHandler
from tornado.options import define, options
from tornado.websocket import WebSocketHandlerdefine("port", default=8000, type=int)class IndexHandler(RequestHandler):def get(self):self.render("index.html")class ChatHandler(WebSocketHandler):users = set() # 用来存放在线用户的容器def open(self):self.users.add(self) # 建立连接后添加用户到容器中for u in self.users: # 向已在线用户发送消息u.write_message(u"[%s]-[%s]-进入聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))def on_message(self, message):for u in self.users: # 向在线用户广播消息u.write_message(u"[%s]-[%s]-说:%s" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), message))def on_close(self):self.users.remove(self) # 用户关闭连接后从容器中移除用户for u in self.users:u.write_message(u"[%s]-[%s]-离开聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))def check_origin(self, origin):return True # 允许WebSocket的跨域请求if __name__ == '__main__':tornado.options.parse_command_line()app = tornado.web.Application([(r"/", IndexHandler),(r"/chat", ChatHandler),],static_path = os.path.join(os.path.dirname(__file__), "static"),template_path = os.path.join(os.path.dirname(__file__), "template"),debug = True)http_server = tornado.httpserver.HTTPServer(app)http_server.listen(options.port)tornado.ioloop.IOLoop.current().start()
一.Tornado 基础入门相关推荐
- Python五大主要用途+零基础基础入门全攻略
Python可以做什么? Python的热度毋庸置疑,现在国内,不仅考国家二级计算机证需要学习Python,它甚至出现在了小学生的教材里. 那么高度如此高涨的Python,都可以用来做什么呢? 目前来 ...
- Tornado框架入门教程
Tornado框架入门教程 Tornado在知乎广为使用,当你用Chrome打开网页版本的知乎,使用开发者工具仔细观察Network里面的请求,就会发现有一个特别的状态码为101的请求,它是用浏览器的 ...
- Datawhale零基础入门金融风控 Task2/4 数据分析
Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分,带你来了解数据,熟悉数据,为后续的特征工程做准备,欢迎大家后续多多交流. 赛题:零基础入门数据挖掘 - 零基础入门金融风控 ...
- 用python循环语句求素数_Python基础入门_3条件语句和迭代循环
Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...
- MAYA 2022基础入门学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...
- Blender 3.0基础入门学习教程 Introduction to Blender 3.0
成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...
- 三维地形制作软件 World Machine 基础入门学习教程
<World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...
- SketchUp Pro 2021基础入门学习视频教程
SketchUp Pro 2021基础入门学习视频教程 1280X720 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 流派:电子学习|语言:英语+中文字幕( ...
- Maya基础入门学习教程
Maya基础入门学习教程 视频:.MKV, 1280x720, 共57节课 时长 4小时25分钟,3GB 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 指导老师:Shane Whitt ...
最新文章
- java -jar Incompatible argument to function
- CSDN博客如何转载(技术贴)
- 利用推送测试工具,测试推送是否写好
- nginx+keepalived双master负载均衡配置
- graphpad如何检测方差齐_如何选择方差分析的多重比较方法?资料集锦
- mysql kill 超过1分钟的语句
- 【转】 i2c驱动调试经验
- python数据分析-《Python数据分析与数据化运营》电子版
- 应用商店打开服务器错误,教你应用商店出现错误的修复方法
- 市场需求分析(MRD)模板
- 通过Makefile传参数到代码中
- [安全]在Windows日志里发现入侵痕迹(转载)
- 张云茹计算机,重庆理工大学药学与生物工程学院研究生导师简介-张云茹
- spring-boot自动配置的原理及实现
- android 消息提示机制
- ico图标在线制作工具以及带步骤(图文教程)
- 什么是ITSM Master?
- MEDICI仿真NMOS器件晶体管语法笔记
- MySQL第41题怎么评分_MYSQL练习题54道(包含尽可能多的解决方法及思路)
- 分布式与集群的区别是什么
热门文章
- 前端实现序列帧_炫酷H5中序列图片视频化播放的高性能实现
- hadoop组件---spark实战-----airflow----调度工具airflow的介绍和使用示例
- PostGIS安装---基于centos7
- 用代码写一个九九乘法表
- 2019-02-11~2019-02-15
- sqlserver创建数据库的sql语句
- 2021-05-29-PCB学习重点笔记之二,画原理图
- 基于ThinkPHP+Bootstrap在线购物商城网站设计带推荐
- Windows Server 2003 共享文件夹权限设置
- 本人40多岁大龄码农,国内已经没人要了,被优化后去日本工作,一人上班轻松养活三口之家!...