当前位置: 首页 > news >正文

Tornado学习笔记(1)

参考书籍《Introduction to Tornado》
1.1 Tornado是什么?
Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够 强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站API) 进行异步交互的工具。
1.2 Hello Tornado
下面是一个全功能的Tornado应用的基础示例:

import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web

在程序的最顶部,我们需要导入一些Tornado模块,Tornado还包含一些其他模块,但是在这个例子中,我们最起码需要包含着四个模块。

from tornado.options import define, options 
define("port", default=8000, help="run on the given port", type=int)

这是一个有用的模块(tornado.options)来从命令行中读取设置。我们在这里使用这个模块指定我们的应用监听HTTP请求的端口。
如果一个与define语句中同名的的设置在命令行中被给出,那么他将成为全局options的一个属性。如果程序使用了--help,程序会打印出你在define函数中help指定的参数文本。如果没有指定值,可以用default=所指定的值来代替。type对参数类型进行检验,这里为int,当参数类型不合适是会抛出一个异常。

class IndexHandler(tornado.web.RequestHandler):    
def get(self):        
greeting = self.get_argument('greeting', 'Hello')        
self.write(greeting + ', friendly user!')

这个例子中只定义了一个GET方法,在以后的实际应用中我们可以用到GET POST 等其他的HTTP方法。
这里的get_argumentRequestHandler的内建方法,从一个查询字符串中获取greeting的值。Tornado将使用get_argument的第二个参数值作为默认值。
这里的write方法也是RequestHandler种的一个有用的方法,它将字符串形式的参数写入HTTP响应中。在这里是将greeting参数提供的值写入greeting中,并写到响应中。

if __name__ == "__main__":    
tornado.options.parse_command_line()    
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app) 
http_server.listen(options.port) 
tornado.ioloop.IOLoop.instance().start()

Demo:

import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web

from tornado.options import define, options 
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):    
def get(self):        
greeting = self.get_argument('greeting', 'Hello')        
self.write(greeting + ', friendly user!')

if __name__ == "__main__":    
tornado.options.parse_command_line()    
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app) 
http_server.listen(options.port) 
tornado.ioloop.IOLoop.instance().start()

到这里 这个简单的例子便可以实现了。
可以在命令行中实现,也可以在IDE中实现(个人使用的是Pycharm)

接下来是一个稍微复杂一点的例子,对字符串进行操作的例子:

import textwrap
import tornado.httpserver 
import tornado.ioloop import tornado.options 
import tornado.web
from tornado.options import define, options 
define("port", default=8000, help="run on the given port", type=int)
class ReverseHandler(tornado.web.RequestHandler):    
    def get(self, input):        
        self.write(input[::-1])
class WrapHandler(tornado.web.RequestHandler):    
    def post(self):        
        text = self.get_argument('text')        
        width = self.get_argument('width', 40)        
        self.write(textwrap.fill(text, int(width)))
if __name__ == "__main__":    
    tornado.options.parse_command_line()    
    app = tornado.web.Application(        
        handlers=[            
            (r"/reverse/(\w+)", ReverseHandler),            
            (r"/wrap", WrapHandler)        
            ]
        )    
    http_server = tornado.httpserver.HTTPServer(app)    
    http_server.listen(options.port)    
    tornado.ioloop.IOLoop.instance().start()

这里的GET请求会返回URL路径中指定的字符串的反转格式。如/reverse/tornado返回odanrot。
POST请求将从text格式中取得指定的文本。
这里需要正则表达式相关的知识,到了后面的学习中,必要时再去深入学习。
到目前我们使用了POST GET,Tornado还支持任何合法的HTTP请求。

HTTP状态码

404 Not Found #路径无法匹配时返回404
400 Bad Request #调用一个么有默认值的get_argument函数,并且没有找到给定名称的参数,返回400
405 Method Not Allowed #传入的请求使用了没有定义过的HTTP方法,返回405
500 Internal Server Error #当遇到任何不能让其退出的错误,也会返回500

PS:
看完第一章有一个基本的了解,但是关于web方面的知识还是比较少,譬如http方面。需要同时看《TCP/IP》
而且第一次写这种笔记的话,有些赘述,但是好在可以让自己更好的了解,有一个整理和总结对于学习而言亦有帮助。共勉

相关文章:

  • Linux环境下段错误的产生原因及调试方法小结
  • shell脚本三剑客之grep命令
  • AngularJs Cookies 操作
  • Python基础(面向对象之封装与继承)
  • PAM 验证.so动态链接库
  • 跟学我Kafka源码搭建环境(一)
  • redhat下配置SEED DVS6446开发环境2
  • IntelliJ IDEA导出Java 可执行Jar包
  • 整合大量开源库项目(六)ListView动画,Activityquot;抽象化quot;,顺便提一提”抽象类“Andquot;接口quot;...
  • python---小技巧
  • 《将博客搬至CSDN》
  • 被误解的 MVC 和被神化的 MVVM
  • 老李分享:qtp自动化测试框架赏析-关键字自动化测试框架 2
  • 下载spring-framework链接
  • cocos2d-x android环境搭建总结
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《剑指offer》分解让复杂问题更简单
  • 2018一半小结一波
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java多态
  • k8s如何管理Pod
  • Laravel Telescope:优雅的应用调试工具
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Linux中的硬链接与软链接
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • python大佬养成计划----difflib模块
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 笨办法学C 练习34:动态数组
  • 初探 Vue 生命周期和钩子函数
  • 排序算法之--选择排序
  • 如何学习JavaEE,项目又该如何做?
  • 收藏好这篇,别再只说“数据劫持”了
  • 跳前端坑前,先看看这个!!
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 系统认识JavaScript正则表达式
  • 一道闭包题引发的思考
  • Nginx实现动静分离
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2020)Java后端开发----(面试题和笔试题)
  • (C#)一个最简单的链表类
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Oracle)SQL优化技巧(一):分页查询
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)基于IDEA的JAVA基础10
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Google的Objective-C编码规范
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Project Open Day(2011.11.13)
  • .net refrector
  • .net图片验证码生成、点击刷新及验证输入是否正确