当前位置: 首页 > 编程日记 > 正文

Tornado框架

Tornado介绍

Tornado 是 FriendFeed 使用的可扩展的异步非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py(豆瓣用这个写的) 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)


基本使用​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding:utf-8 -*-
  
import tornado.ioloop
import tornado.web
  
  
class MainHandler(tornado.web.RequestHandler):
    def get(self):                               #根据请求method,通过反射找到get方法;
        self.write("Hello, world")
  
application = tornado.web.Application([
    (r"/index", MainHandler),                    #一个映射对应一个类
])
  
  
if __name__ == "__main__":
    application.listen(8888)                     #socket
    tornado.ioloop.IOLoop.instance().start()

第一步:执行脚本,监听 8888 端口

第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8888/index

第三步:服务器接受请求,并交由对应的类处理该请求

第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

第五步:方法返回值的字符串内容发送浏览器


详细介绍

一、路由系统​

路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# -*- coding:utf-8 -*-
  
import tornado.ioloop
import tornado.web
  
  
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
  
class StoryHandler(tornado.web.RequestHandler):
    def get(self, story_id):
        self.write("You requested the story " + story_id)
  
class BuyHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("buy.wupeiqi.com/index")
  
application = tornado.web.Application([
    (r"/index", MainHandler),
    (r"/story/([0-9]+)", StoryHandler),
])
  
application.add_handlers('buy.wupeiqi.com$', [
    (r'/index',BuyHandler),
])
  
if __name__ == "__main__":
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()

二、模板

三、实用功能

四、扩展功能

1、自定义session

2、自定义模型绑定

表单提交验证

用户输入与对象正则表达式的字段进行匹配,没错误返回True。

template/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link href="{{static_url("commons.css")}}" rel="stylesheet" />
</head>
<body>
    <h1>hello</h1>
    <form action="/index" method="post">
        <p>hostname: <input type="text" name="host" /> </p>
        <p>ip: <input type="text" name="ip" /> </p>
        <p>port: <input type="text" name="port" /> </p>
        <p>phone: <input type="text" name="phone" /> </p>
        <input type="submit" />
    </form>
</body>
</html>

index.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python
# -*- coding:utf-8 -*-
  
import tornado.ioloop
import tornado.web
import re
  
  
class MainForm(object):
    def __init__(self):
        self.host = "(.*)"
        self.ip = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$"
        self.port = '(\d+)'
        self.phone = '^1[3|4|5|8][0-9]\d{8}$'
  
    def check_valid(self, request):
        form_dict = self.__dict__   #获取这个对象的所有字段
        for key, regular in form_dict.items():
            post_value = request.get_argument(key)
            #get_argument()是request方法,获取html表单中name就是key,所以这个字段名称和name最好对应
            # 让提交的数据 和 定义的正则表达式进行匹配,只能用match,从头匹配
            ret = re.match(regular, post_value)
            if not ret:
                return False
        return True
  
  
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html',name="test")
    def post(self, *args, **kwargs):
        obj = MainForm()
        result = obj.check_valid(self)
        print result    #全部输入正确就是True
        self.write('ok')
  
  
  
settings = {
    'template_path': 'template',
    'static_path': 'static',
    'static_url_prefix': '/static/',
}
  
application = tornado.web.Application([
    (r"/index", MainHandler),
], **settings)      #路由系统,应用配置settings,静态文件会去template目录里找;
  
  
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()




























来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/daliangtou/p/5370873.html

相关文章:

重组系统分区时设置系统盘

在快速分区那里选择另外一个模式&#xff0c;并且只选一个主分区

Javascript:DOM动态创建元素实例应用

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Dom:动态创建元素</title> </head> <body><ul id"demo1"> </ul> <input type"text" id"t…

上帝和面向对象的七天

上帝用7天创造了“面向对象” |【Python之父客串】http://bbs.fishc.com/thread-102596-1-1.html(出处: 鱼C论坛) 第一天&#xff1a; 计算机的诞生使得人类使用汇编语言进行编程&#xff0c;上帝说这个太复杂了&#xff0c;于是将编译的秘密告诉约翰.巴克斯.于是巴克斯创造了…

Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

准备好开始为游戏制作自己的角色动画了吗&#xff1f; 你会学到什么 了解Maya的界面 优化并准备好你的模型&#xff0c;为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼&#xff0c;以便在任何游戏引擎中制作动画 了解IK和FK系统之间的区别 组织我们的3d场景以获得…

KMP算法简单分析

定义问题 字符串匹配是这样一个问题&#xff1a; 对于两个包含且仅包含字母表∑中的字母的串P&#xff0c;T&#xff0c;计算出所有有效的**移进**s使得P[1..|P|] T[s1..s|P|]。(|P|为P的长度)。 或者说&#xff1a;求出在什么位置P被T完全包含。 为了表达方便&#xff0c;定…

mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询

图/文&#xff1a;迷神Thinkphp是一款不错的国产框架&#xff0c;使用范围广&#xff0c;应用也比较多。随着网站访问增大往往需要使用mysql主从同步功能&#xff0c;本身Thinkphp自带了主从读写分离的功能了。但是我们经常有一个场景就是某些特定的查询需要从主库进行查询&…

Microsoft Store无法联网解决方法

设置 网络 代理 关闭

MongoDB for C#基础入门

笔者这里采用的是mongoDB官网推荐使用.net驱动&#xff1a; http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/ 有关于MongoDB的安装读者可以参考其他的博客&#xff0c;对于基本的学习来说并不需要进行过多的配置。 创建连接 这一步骤跟ADO.NET连…

李宏毅机器学习自己的笔记(一)----------Introduction of MachineLearning

视频来源&#xff1a;李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p2 声明&#xff1a;图片均来自于视频截图 问题一&#xff1a; AI&#xff0c;机器学习 &#xff0c;深度学习关系 答&#xff1a;AI人工智能…

Unity从零开始构建能力体系 Unity Ability System

从零开始构建能力体系 你会学到什么 如何实施能力体系 如何使用用户界面工具包创建用户界面 如何使用Unity的GraphView API 如何实现保存系统 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根…

mybatis-plus对datetime返回去掉.0_华为AI认证-TensorFlow2.0编程基础

参考《HCIA-AI2.0培训教材》《HCIA-AI2.0实验手册》认证要求&#xff1a;了解TensorFlow2.0是什么以及其特点掌握TensorFlow2.0基础和高阶操作方法熟悉TensorFlow2.0中的Keras API简介&#xff1a;TensorFlow是目前最为流行的深度学习框架&#xff0c;是人工智能领域的第一主要…

dev c++ 调试时候发生软件崩溃解决办法

dev c 调试时候发生软件崩溃解决办法 安装好dev cpp&#xff0c;准备调试的时候发现软件崩溃&#xff0c;这种情况很好解决。只要在工具菜单中点开编译选项&#xff0c;找到代码生成/优化一栏&#xff0c;将链接器的“产生调试信息”选项改为yes&#xff0c;即可

运行hadoop fs -ls 命令显示本地目录问题

2019独角兽企业重金招聘Python工程师标准>>> 运行hadoop fs -ls 命令显示本地目录问题 问题原因&#xff1a;是因为在hadoop配置文件中没有指定HDFS的默认路径 解决办法&#xff1a;有两个办法 1、使用HDFS全路径访问 hadoop fs -ls hdfs://192.168.1.1:9000/ 2…

李宏毅机器学习笔记(二)-------Why we need learn Machine Learning?

视频&#xff1a; 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibilihttps://www.bilibili.com/video/av10590361/?p2 真是一个逗波&#xff1a; AI训练师&#xff1a; 为AI选择合适的model和损失函数。然后达到最好的功能

mixamo网站FBX模型带骨骼绑定动作库

mixamo网站FBX模型带骨骼绑定动作库&#xff0c;unity游戏各职业人物动画&#xff0c;兼容3dmax maya c4d iclone blender等主流3D软件 mixamo游戏3D模型带骨骼绑定FBX动作库 大小解压后&#xff1a;17.2G 素材获取&#xff1a;mixamo网站FBX模型带骨骼绑定动作库-云桥网

java modbus通讯协议_物联通讯协议一(Modbus)

1、Modbus是一种串行通信协议&#xff0c;是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto)&#xff0c;并且现在是工业电子设备之间常用的连接方式。2、Modbus是一种串…

hibernate3

hibernate3 &#xff08;整合到spring中的core核心配置中的hibernate3&#xff09; <!-- 基于hibernate的Session工厂 --><bean id"sessionFactory"class"org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><!…

伦理困境:人工智能浪潮与“AI威胁论”之争

首先&#xff0c;何为伦理&#xff1f; 2018年1月份的《科学与社会》报刊中有如下阐述&#xff1a; 伦理一词&#xff0c;英文为ethics&#xff0c;一词源自于希腊文的“ethos”&#xff0c;其意义与拉丁文“mores”差不多&#xff0c;表示风俗、习惯的意思。西方的伦理学发展流…

在 ASP.NET 网页中不经过回发而实现客户端回调

一、使用回调函数的好处 在 ASP.NET 网页的默认模型中&#xff0c;用户会与页交互&#xff0c;单击按钮或执行导致回发的一些其他操作。此时将重新创建页及其控件&#xff0c;并在服务器上运行页代码&#xff0c;且新版本的页被呈现到浏览器。但是&#xff0c;在有些情况下&…

李宏毅机器学习笔记(三)——Regression: output a scalar amp;amp; Gradient Descent

视频来源&#xff1a; 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p3机器学习的目的就是找到最优函数&#xff0c;而回归的目的就是我们要找的函数的输出是一个数值。例如下面的例子&#xff0c;不管是输入怎样的…

完整的虚幻引擎超级课程:从初学者到专家

通过这个循序渐进的课程&#xff0c;学习如何像专业人士一样开发游戏和设计&#xff01; 你会学到什么 如何使用虚幻引擎及其元素 电子游戏力学原理 平衡计分卡几何原理 蓝图脚本的原则 如何设计、开发和编写你的关卡来复制你最喜欢的游戏 流派:电子学习| MP4 |视频:h264&…

atitit.userService 用户系统设计 v5 q330

atitit.userService 用户系统设计 v5 q330 1. 新特性1 2. Admin login1 3. 用户注册登录2 3.1. <!-- 会员注册使用 --> 商家注册2 3.2. <!-- 会员登录使用 -->3 3.3. <!-- 会员退出登录 -->3 3.4. <!-- 进入会员首页 -->3 3.5. <!-- 进入会员信…

python打包为exe文件_Pyinstaller(python打包为exe文件)

需求分析&#xff1a; python脚本如果在没有安装python的机器上不能运行&#xff0c;所以将脚本打包成exe文件&#xff0c;降低脚本对环境的依赖性&#xff0c;同时运行更加迅速。 当然打包的脚本似乎不是在所有的win平台下都能使用&#xff0c;win7有一部分不能使用&#xff0…

从风投看中国IT行业的发展

创业相关电视剧中经常会出现一个词“风投”&#xff0c;例如主角创业艰辛&#xff0c;得到了风投的帮助&#xff0c;从而走向了人生巅峰。而“风投”并不是一家企业&#xff0c;它是由无数风险投资公司一同组成的行业&#xff0c;今天就带大家了解一下风投与中国IT行业的紧密联…

c++ 字母排序

char a[123] {Z, s, p, l, j, r, q, v, n, m, C, F, D, B, A, 2, 0, Z, };for (int i 0; i < strlen(a); i){//字母排序for (int j i 1; j < strlen(a); j){if (a[j] < a[i]){char pTem a[j];a[j] a[i];a[i] pTem;}}}printf("%s\n", a); 版权声明&a…

李宏毅笔记机器学习(四)——Regression——Demo

视频来源&#xff1a; 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p4 重点&#xff1a; &#xff08;1&#xff09;调节lr&#xff08;learning rate步长&#xff09;&#xff0c;lr参数的调节。迭代次数为1000次…

Blender 3.0机器人硬面建模材质渲染全流程学习课程

学习在Blender中建模硬表面机器人角色 你会学到什么 Blender 3.0建模工具 Blender 3.0硬面人物造型 机器人角色的UV展开 如何在Blender中渲染 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;…

python抓包工具_「docker实战篇」python的docker爬虫技术-fiddler抓包软件详细配置(七)...

挑选常用的功能给各位老铁介绍下。 fiddler第一次进入fiddlerfiddler会请求fiddler的官网&#xff0c;检查更新操作布局分布 工具栏File -capture traffic开启爬虫File -new Viewer新建立一个窗口File - save保存all session&#xff0c;request方式&#xff0c;reponse的方式z…

loadrunner支持https协议的操作方法-经验总结

问题&#xff1a;用户portal支持https协议&#xff0c;用loadrunner录制登陆脚本时发现未录制到用户名和密码 录制到的脚本如下&#xff1a; login() { lr_think_time(10); web_url("verifycode.jsp", "URLhttps://192.168.211.246:56661/portal/common/jsp/ver…

初试linux编译(ubuntu+vim)+玩转智能蛇

一.初试linux编译&#xff08;ubuntuvim&#xff09; 步骤&#xff1a; ①下载vmware15ubuntu桌面版映像 ②安装ubuntu ③下载vimgcc 在ubuntu终端输入&#xff1a; sudo apt-get install vim-gtk sudo apt-get install gcc④安装完毕后进行编译测试 1&#xff09;新建hellow…