一, 安装 tornado
pyvip@Vip:~$ workon py3env #安装 python3 的虚拟环境
(py3env) pyvip@Vip:~$ pip install tornado #安装 tornado
二, 使用 tornado
- # 创建一个 py 文件, 然后在虚拟机中打开文件即可
- # 要让服务一直在运行当中, 这就要用到 tornado.ioloop 模块
- # 为了便于开发, 就要用到 tornado.web 模块
- import tornado.ioloop #开启循环, 让服务一直等待请求的到来
- import tornado.web #web 服务基本功能都封装在此模块中
- class MainHandler(tornado.web.RequestHandler):
- def get(self):
- self.write('hello')
- application = tornado.web.Application(
- [
- (r'/',MainHandler)
- ]
- )
- if __name__ == '__main__':
- application.listen(8080)
- tornado.ioloop.IOLoop.instance().start()
三, 路由
- # 端口: 为了提高效率, 给专门的服务开专门的 "门"
- # 客户端 (浏览器, windows) 访问服务器 (虚拟机, linux), 然后虚拟机的 web 服务和 tornado 服务返回数据给客户端, 中间由 virtualBox 分隔开
- # 客户端的端口 8080 与服务器的端口 8080 是不一样的, 是通过 virtualbox 的端口转发实现的
- # 客户端的 8080 被访问的时候, 被 virtualbox 占用了, virtualbox 把请求发送到服务器的 8080 端口去, 然后再经过 tornado 服务处理
- # 端口未被占用才能够监听, 被占用了再监听会报错
反馈
- # 浏览器报错
- # 无法访问: 表示服务器没开或者炸了, 你根本进不去
- #404:Not Found: 表示禁止访问, 你近视进去了, 但是无法访问内容
路由表
- application = tornado.web.Application(
- [
- (r'/index',MainHandler) #r''表示去除转译
- ]
- )
- # 客户端访问服务器可以看成是: 客户端读取服务器资源的一个过程, 路由表就指定了具体访问什么资源
- # 路由表是访问服务器的入口
- # 在工作中如果有新的需求, 往往只需要在路由器中添加新的路由即可
- Handler
- class MainHandler(tornado.web.RequestHandler):
- def get(self):
- self.write('hello')
- # 在这里指定请求的资源, 比如输出 hello; 需要继承 tornado.web.RequestHandler
- import tornado.ioloop
- import tornado.web
- class MainHandler(tornado.web.RequestHandler): #括号内继承父类
- def get(self):
- self.write('hello') #write 能够将内容输出到浏览器当中
- application = tornado.web.Application(
- [ #列表里面是一个个的元组, 多个元组分别用逗号隔开, 元组里面有路径由该路径下的内容组成
- (r'/index',MainHandler) #/index 表示路径, 当访问的时候输入这个路径, 返回的就是这个路径下的内容; 如果访问的时候未找到该路径, 就会返回 404 错误; 这也就是路由的意义
- ]
- )
- if __name__ == '__main__':
- application.listen(8080) #监听 8080 端口
- tornado.ioloop.IOLoop.instance().start() #让这个 tornado 一直保持运行的状态
四, 启动 tornado
- # 怎样获取命令行参数 argv
- import tornado.httpserver
- import tornado.ioloop
- import tornado.options
- import tornado.web
- from tornado.options import define,options
- define('port',default=8080,help = 'run port',type=int) #设定 port 的默认值为 8080, 在 linux 里面可以指定 port 的值, 类型为整型
- class IndexHandler(tornado.web.RequestHandler):
- def get(self):
- self.write('dage')
- application = tornado.web.Application(
- handlers=[
- (r'/index',IndexHandler)
- ]
- )
- if __name__ == '__main__':
- tornado.options.parse_command_line()
- http_server = tornado.httpserver.HTTPServer(application) #返回网站服务的实例, 下面再用这个实例进行监听
- http_server.listen(options.port) #option.port 就是 define 定义的 port, 把写死的端口变成一个可变的端口
- tornado.ioloop.IOLoop.instance().start()
五, 输入与输出
- #tornado 如何与浏览器做交互
- # 通过 url,"路由"+ "?"+"变量名"+"变量"
- import tornado.httpserver
- import tornado.ioloop
- import tornado.options
- import tornado.web
- from tornado.options import define,options
- define('port',default=8080,help = 'run port',type=int)
- class IndexHandler(tornado.web.RequestHandler):
- def get(self):
- self.write('dage')
- class OutHandler(tornado.web.RequestHandler):
- def get(self):
- name = self.get_argument('name','no') #用 get_agument 来定义变量名和默认变量值, 如果不设置默认变量的时候并且没有传入参数就会报错
- self.write('hello'+ name)# write 便是输出
- self.write('aaa\naaa') #加了 \ n 表示换行, 但在网页里面显示不出来换行, 原因是 html 里面的换行是 br, 所以这里面要换行需要用 < br>;write 可以解析 html 的 CSS,JavaScript
- application = tornado.web.Application(
- handlers=[
- (r'/index',IndexHandler),
- (r'/out',OutHandler)
- ]
- )
- if __name__ == '__main__':
- tornado.options.parse_command_line()
- http_server = tornado.httpserver.HTTPServer(application)
- http_server.listen(options.port)
- tornado.ioloop.IOLoop.instance().start()
来源: http://www.bubuko.com/infodetail-2573636.html