安装tornado
使用pip install tornado
即可快速安装
本文中使用的版本为 tornado 5.0
搭建一个tornado分为以下三个步骤
# file: apps.py
import tornado.web
import tornado.httpserver
import tornado.ioloop
# 1. 声明tornado app 实例
app = tornado.web.Application()
# 2. 创建 tornado http server
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(8080) # 设置服务器的端口
http_server.start() # 声明要开启几个进程,windows平台上不能为0
# 3. 开启 tornado 的事件循环
tornado.ioloop.IOLoop.current().start() # 事件循环开启
我们搭建了一个服务,但是它并不能处理任何事情。我们需要tornado服务可以被访问并在网页上显示,可以使用RequestHandler
来定义一个类视图(接触过django的同学应该比较熟悉视图这个概念)
class MainHandler(tornado.web.RequestHandler, ABC):
"""基于类的视图写法"""
def get(self):
"""这里的get方法就是http请求中的GET"""
self.write('Hello World!') # 返回数据使用write
这个类视图实现了一个get方法,当打开页面时会向页面中写入字符串Hello World!
,当然除了get方法还有我们熟知的post
,put
等方法
仅仅定义类视图是不够的,同样也需要声明路由,这样我们才能根据路由地址访问类视图里的内容。修改上面apps.py中的代码
... # 省略内容:导包,类视图
if __name__ == '__main__':
# 1. tornado app 实例
app = tornado.web.Application(
[
(r'/', MainHandler),
],
)
... # 省略内容:http_server, 事件循环开启
运行apps.py,然后打开浏览器访问127.0.0.1:8080
(注意8080是声明的端口号,可以自定义),你将会看到如下内容
这虽是一个简单的tornado网页,但将是你入门tornado迈出的第一步
紧接着我们趁热打铁来创建一个能接收参数的类视图
class ParamsHandler(tornado.web.RequestHandler):
def get(self):
name = self.get_query_argument('name') # 获取一个字段的值,这字段是 name,只接收一个值
names = self.get_query_arguments('names') # 获取一个字段的值,这字段是 names,可以接收多个值,以列表的形式
self.write(f'Hello {name}, ')
self.write(f'Hello {names}, ')
设置路由
... # 省略内容:导包,类视图
app = tornado.web.Application(
[
(r'/', MainHandler),
(r'/params', ParamsHandler),
],
)
... # 省略内容:http_server, 事件循环开启
运行apps.py,然后打开浏览器访问127.0.0.1:8080/params?name=laowang&names=[laoli,laozhang]
(后面的值可以改成你喜欢的参数),你将会看到如下内容
我们可以使用write_error
方法来指定引发一个http错误
class ErrorHandler(tornado.web.RequestHandler):
def get(self):
self.write_error(404)
... # 省略内容:导包,类视图
app = tornado.web.Application(
[
... # 省略内容:其它类视图路由
(r'/error', ErrorHandler),
],
)
... # 省略内容:http_server, 事件循环开启
运行并访问一下127.0.0.1:8080/error
,来看一下效果
如果我们的代码执行出错了会是什么样?同样我们可以定义一个类视图来试一下
from tornado.httpclient import HTTPError
class ErrorHandler(tornado.web.RequestHandler):
def get(self):
raise HTTPError(404) #引发一个404错误
运行并访问一下127.0.0.1:8080/error
,将会看到如下界面,同时控制台也会报错
如果正式的项目中出现了错误,直接展示这个界面给用户肯定是不行的,我们可以重写write_error
方法来实现对错误的可控
class ErrorHandler(tornado.web.RequestHandler):
... # 省略内容:get 方法
def write_error(self, status_code, **kwargs):
data = {
'status_code': status_code,
}
# write除了可以写入字符串之外,也可以写入字典类型
self.write(data) # 将数据写入缓存区
再次运行并访问一下127.0.0.1:8080/error
,将会看到如下界面。这就实现了对后台错误的可控性
Tornado同样可以使用render方法来渲染html模板,下面我们自定义一个简单的html文件来实验一下(file: index.html)
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test1title>
head>
<body>
<h1>This is tornadoh1>
body>
html>
接下来修改一下之前的主页代码
# file: apps.py
class MainHandler(tornado.web.RequestHandler, ABC):
"""基于类的视图写法"""
def get(self):
self.render('index.html') # html文件放在本py文件的同级目录下
运行并访问127.0.0.1:8080
,得到的效果如图
把html文件放在py文件目录中有失美观,我们想要把html这类静态文件放到一个templates
文件中,可以使用以下方法
# file: apps.py
BASE_DIR = os.path.dirname(__file__) + '/' # 获取当前目录的绝对路径
template_path = os.path.join(BASE_DIR, 'templates') # 拼接模板路径
print(template_path)
# 配置信息
settings = {
'debug': True,
'template_path': template_path # 这里的key是固定写法
}
... # 省略内容:导包,类视图
class MainHandler(tornado.web.RequestHandler, ABC):
"""基于类的视图写法"""
def get(self):
self.write(self.get_template_path()) # 写入模板路径
self.render('index.html') # html文件放在本py文件的同级目录下
...
app = tornado.web.Application(
[
(r'/', MainHandler),
(r'/params', ParamsHandler),
(r'/error', ErrorHandler),
],
**settings, # 解包
)
... # 省略内容:http_server, 事件循环开启
运行结果如图:
注意:os.path.dirname(__file__) + '/'
这段代码可能会有系统环境的差异,我当前的win10系统直接运行以下代码的结果是:
import os
BASE_DIR1 = os.path.dirname(__file__)
BASE_DIR2 = os.path.dirname(__file__) + '/'
template_path1 = os.path.join(BASE_DIR1, 'templates')
template_path2 = os.path.join(BASE_DIR2, 'templates')
print(template_path1)
print(template_path2)
# result:
D:/Fire/PycharmProject/tornado_test/apps/test\templates
D:/Fire/PycharmProject/tornado_test/apps/test/templates
同学们可能由于环境差异不需要+ '/'
,删掉即可
如果你喜欢本文,麻烦点赞支持一下,如果对文中内容有意见,请在评论区给我留言,我们一起对文章进行改进,谢谢~