【Tornado框架】如何搭建tornado服务

web服务开发入门

安装tornado

使用pip install tornado即可快速安装

本文中使用的版本为 tornado 5.0

搭建tornado服务

搭建一个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()     # 事件循环开启

RequestHandler + Application

我们搭建了一个服务,但是它并不能处理任何事情。我们需要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,将会看到如下界面。这就实现了对后台错误的可控性

在这里插入图片描述

渲染HTML模板

Tornado同样可以使用render方法来渲染html模板,下面我们自定义一个简单的html文件来实验一下(file: index.html)

<!--file: index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test1</title>
</head>
<body>
    <h1>This is tornado</h1>
</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

同学们可能由于环境差异不需要+ '/',删掉即可


如果你喜欢本文,麻烦点赞支持一下,如果对文中内容有意见,请在评论区给我留言,我们一起对文章进行改进,谢谢~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值