zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    注册、登录、忘记密码实战
    python3错误:format() takes at most 2 arguments
    Charles手机抓包简要步骤
    VARCHAR2(N CHAR)与VARCHAR2(N)的区别
    关于VI一些常用的操作
    LINUX下 基于 Socket 的 UDP 和 TCP 编程具体实现
    VC++6.0实现文本格式的转换保存
    crt的sftp使用用于Windows与Linux之间的通讯
    pl/sql 导出脚本与使用
    在oracle10g下启动服务报 Permission denied错误解决方法
  • 原文地址:https://www.cnblogs.com/jamchen/p/6671264.html
Copyright © 2011-2022 走看看