一、tornado简介:
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)
使用流程:
1.安装tornado模块
pip3 install tornado
源码安装
https:
/
/
pypi.python.org
/
packages
/
source
/
t
/
tornado
/
tornado
-
4.3
.tar.gz
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import tornado.ioloop 5 import tornado.web 6 7 8 class MainHandler(tornado.web.RequestHandler): 9 def get(self): 10 self.write("Hello, world") 11 12 application = tornado.web.Application([ 13 (r"/index", MainHandler), 14 ]) 15 16 17 if __name__ == "__main__": 18 application.listen(8888) 19 tornado.ioloop.IOLoop.instance().start()
执行过程:
- 第一步:执行脚本,监听 8888 端口
- 第二步:浏览器客户端访问 /index --> http://127.0.0.1:8888/index
- 第三步:服务器接受请求,并交由对应的类处理该请求
- 第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
- 第五步:方法返回值的字符串内容发送浏览器
二、tornado 路由系统
路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。
Tornado中原生支持二级域名的路由,如:
三、静态文件配置
对于静态文件,可以配置静态文件的目录和前段使用时的前缀,并且Tornaodo还支持静态文件缓存。
1 settings = { 2 'template_path': 'template',#配置模板文件的路径 html 3 'static_path': 'static', #配置静态文件的路径,如:js/css/img···· 4 'static_url_prefix': '/static/',#静态文件的前缀,定义后再html中静态文件路劲前缀必须使用sss, 5 } 6 7 application = tornado.web.Application([ 8 (r"/index", MainHandler), 9 ], **settings)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link href="{{static_url("commons.css")}}" rel="stylesheet" /> </head> <body> <h1>hello</h1> </body> </html>
<link href="{{static_url("commons.css")}}" rel="stylesheet" />中static_url自动添加了static文件夹的地址,在客户端浏览器做缓存用,浏览器中显示后面的值是文件的MD5值。
待解:jQuery导入失败原因
session
python tornado 中需要自定session
session原理:
1.客户端发送请求信息,服务端为用户端生成一个加密随机字符串random_str,然后将用户的信息作为这个随机字符串random_str的值,增加用户信息的安全性;
2.将random_str做为cookie写入给客户端,然后服务端进行判断用户携带cookie的情况
1 import tornado.web 2 import tornado.ioloop 3 4 class Session(): 5 def __init__(self,handler): 6 self.random_str = None 7 self.handler = handler 8 def __random_str(self): 9 '''生成随机字符串''' 10 import hashlib 11 import time 12 obj = hashlib.md5() 13 obj.update(bytes(str(time.time()), encoding='utf-8')) 14 random_str = obj.hexdigest() 15 return random_str 16 17 def __setitem__(self,key,value): 18 '''设置用户信息''' 19 random_str = self.handler.get_cookie('user_cookie') 20 if not self.random_str: 21 if not random_str: 22 random_str = self.__random_str() 23 container[random_str]={} 24 else: 25 if random_str in container.keys(): 26 pass 27 else: 28 random_str = self.__random_str() 29 container[random_str]={} 30 self.random_str = random_str 31 container[self.random_str][key] = value 32 self.handler.set_cookie('user_cookie',self.random_str) 33 def __getitem__(self,key): 34 '''获取用户信息''' 35 random_str = self.handler.get_cookie('user_cookie') 36 if not random_str: 37 return None 38 user_info_dict = container.get(random_str,None) 39 if not user_info_dict: 40 return None 41 value = user_info_dict.get(key,None) 42 return value 43 container={} 44 class BaseHandler(tornado.web.RequestHandler): 45 def initialize(self): 46 self.session =Session(self) 47 class IndexHandler(BaseHandler): 48 def get(self): 49 if self.get_argument('user',None) in ["jam","nina"]: 50 self.session['is_login'] =True 51 self.session['name'] = self.get_argument('user',None) 52 self.write('登录成功') 53 self.redirect('/manager') 54 else: 55 self.render('index.html',item = '请登录') 56 57 class ManagerHandler(BaseHandler): 58 def get(self): 59 val = self.session['is_login'] 60 if val: 61 self.write('user:%s'%self.session['name']) 62 else: 63 self.render('index.html',item='login fail') 64 settings={ 65 "template_path":"views", 66 } 67 68 application = tornado.web.Application([ 69 (r'/index',IndexHandler), 70 (r'/manager',ManagerHandler), 71 ],**settings) 72 73 if __name__=="__main__": 74 application.listen(8880) 75 tornado.ioloop.IOLoop.instance().start()