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 基础入门相关推荐

  1. Python五大主要用途+零基础基础入门全攻略

    Python可以做什么? Python的热度毋庸置疑,现在国内,不仅考国家二级计算机证需要学习Python,它甚至出现在了小学生的教材里. 那么高度如此高涨的Python,都可以用来做什么呢? 目前来 ...

  2. Tornado框架入门教程

    Tornado框架入门教程 Tornado在知乎广为使用,当你用Chrome打开网页版本的知乎,使用开发者工具仔细观察Network里面的请求,就会发现有一个特别的状态码为101的请求,它是用浏览器的 ...

  3. Datawhale零基础入门金融风控 Task2/4 数据分析

    Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分,带你来了解数据,熟悉数据,为后续的特征工程做准备,欢迎大家后续多多交流. 赛题:零基础入门数据挖掘 - 零基础入门金融风控 ...

  4. 用python循环语句求素数_Python基础入门_3条件语句和迭代循环

    Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...

  5. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  6. Blender 3.0基础入门学习教程 Introduction to Blender 3.0

    成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...

  7. 三维地形制作软件 World Machine 基础入门学习教程

    <World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...

  8. SketchUp Pro 2021基础入门学习视频教程

    SketchUp Pro 2021基础入门学习视频教程 1280X720 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 流派:电子学习|语言:英语+中文字幕( ...

  9. Maya基础入门学习教程

    Maya基础入门学习教程 视频:.MKV, 1280x720, 共57节课 时长 4小时25分钟,3GB 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 指导老师:Shane Whitt ...

最新文章

  1. java -jar Incompatible argument to function
  2. CSDN博客如何转载(技术贴)
  3. 利用推送测试工具,测试推送是否写好
  4. nginx+keepalived双master负载均衡配置
  5. graphpad如何检测方差齐_如何选择方差分析的多重比较方法?资料集锦
  6. mysql kill 超过1分钟的语句
  7. 【转】 i2c驱动调试经验
  8. python数据分析-《Python数据分析与数据化运营》电子版
  9. 应用商店打开服务器错误,教你应用商店出现错误的修复方法
  10. 市场需求分析(MRD)模板
  11. 通过Makefile传参数到代码中
  12. [安全]在Windows日志里发现入侵痕迹(转载)
  13. 张云茹计算机,重庆理工大学药学与生物工程学院研究生导师简介-张云茹
  14. spring-boot自动配置的原理及实现
  15. android 消息提示机制
  16. ico图标在线制作工具以及带步骤(图文教程)
  17. 什么是ITSM Master?
  18. MEDICI仿真NMOS器件晶体管语法笔记
  19. MySQL第41题怎么评分_MYSQL练习题54道(包含尽可能多的解决方法及思路)
  20. 分布式与集群的区别是什么

热门文章

  1. 前端实现序列帧_炫酷H5中序列图片视频化播放的高性能实现
  2. hadoop组件---spark实战-----airflow----调度工具airflow的介绍和使用示例
  3. PostGIS安装---基于centos7
  4. 用代码写一个九九乘法表
  5. 2019-02-11~2019-02-15
  6. sqlserver创建数据库的sql语句
  7. 2021-05-29-PCB学习重点笔记之二,画原理图
  8. 基于ThinkPHP+Bootstrap在线购物商城网站设计带推荐
  9. Windows Server 2003 共享文件夹权限设置
  10. 本人40多岁大龄码农,国内已经没人要了,被优化后去日本工作,一人上班轻松养活三口之家!...