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》
而且第一次写这种笔记的话,有些赘述,但是好在可以让自己更好的了解,有一个整理和总结对于学习而言亦有帮助。共勉


LearnX
从小白到小牛

Doge

12 声望
0 粉丝
0 条评论
推荐阅读
Tornado学习笔记(2)
这个表单包括了多个文本,其中的内容在用户点击提交之后以POST请求的方式发送到/poem。Tornado为了响应这个请求会自动跳到poem.html,并且插入你在表单中填写的值。

qmwk2阅读 3.1k

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4k评论 1

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 349

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 2.1k评论 4

封面图
Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.4k

打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎鱼。大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。当时我们还想着 Go 团队应该不会接纳,至少不会那么快:懒得翻也可以看我再次...

煎鱼1阅读 3.3k

uwsgi 注意事项
http 和 http-socket 选项是完全不同的。第一个生成一个额外的进程,转发请求到一系列的worker (将它想象为一种形式的盾牌,与apache或者nginx同级),而第二个设置worker为原生使用http协议。

zed2015阅读 2.2k

Doge

12 声望
0 粉丝
宣传栏