python tornado 基础

一、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
  2.创建py文件
 
 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>
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()
session
原文地址:https://www.cnblogs.com/jamchen/p/6671264.html