tornado框架初探

1、tornado概述

Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅The C10K problem)

Tornado代表嵌入实时应用中最新一代的开发和执行环境。 Tornado 包含三个完整的部分:

(1)、Tornado系列工具, 一套位于主机或目标机上强大的交互式开发工具和使用程序;

(2)、VxWorks 系统, 目标板上高性能可扩展的实时操作系统;

(3)、可选用的连接主机和目标机的通讯软件包 如以太网、串行线、在线仿真器或ROM仿真器。

2、tornado特点

Tornado的独特之处在于其所有开发工具能够使用在应用开发的任意阶段以及任何档次的硬件资源上。而且,完整集的Tornado工具可以使开发人员完全不用考虑与目标连接的策略或目标存储区大小。Tornado 结构的专门设计为开发人员和第三方工具厂商提供了一个开放环境。已有部分应用程序接口可以利用并附带参考书目,内容从开发环境接口到连接实现。Tornado包括强大的开发和调试工具,尤其适用于面对大量问题的嵌入式开发人员。这些工具包括C和C++源码级别的调试器,目标和工具管理,系统目标跟踪,内存使用分析和自动配置. 另外,所有工具能很方便地同时运行,很容易增加和交互式开发。

3、tornado模块索引

最重要的一个模块是web, 它就是包含了 Tornado 的大部分主要功能的 Web 框架。其它的模块都是工具性质的, 以便让 web 模块更加有用 后面的 Tornado 攻略 详细讲解了 web 模块的使用方法。

主要模块

  • web - FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能
  • escape - XHTML, JSON, URL 的编码/解码方法
  • database - 对 MySQLdb 的简单封装,使其更容易使用
  • template - 基于 Python 的 web 模板系统
  • httpclient - 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作
  • auth - 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
  • locale - 针对本地化和翻译的支持
  • options - 命令行和配置文件解析工具,针对服务器环境做了优化

底层模块

  • httpserver - 服务于 web 模块的一个非常简单的 HTTP 服务器的实现
  • iostream - 对非阻塞式的 socket 的简单封装,以方便常用读写操作
  • ioloop - 核心的 I/O 循环

4.tornado框架使用

1.基本用法

import tornado.web
import tornado.ioloop

class IndexHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        self.write("Hello World")

application = tornado.web.Application([
    (r‘/index‘,IndexHandler),
])

if __name__ == "__main__":
    application.listen(8080)
    tornado.ioloop.IOLoop.instance().start()

第一步:执行脚本,监听 8080 端口

第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8080/index

第三步:服务器接受请求,并交由对应的类处理该请求

第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

第五步:然后将类的方法返回给浏览器

5.tornado路由系统

在tornado web框架中,路由表中的任意一项是一个元组,每个元组包含pattern(模式)和handler(处理器)。当httpserver接收到一个http请求,server从接收到的请求中解析出url path(http协议start line中),然后顺序遍历路由表,如果发现url path可以匹配某个pattern,则将此http request交给web应用中对应的handler去处理。由于有了url路由机制,web应用开发者不必和复杂的http server层代码打交道,只需要写好web应用层的逻辑(handler)即可。Tornado中每个url对应的是一个类。

import tornado.web
import tornado.ioloop

class IndexHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        self.write("Hello World")

class LoginHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        self.write("<input type = ‘text‘>")

class RegisterHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        self.write("<input type = ‘password‘>")

application = tornado.web.Application([
    (r‘/index/(?P<page>\d*)‘,IndexHandler),  # 基础正则路由
    (r‘/login‘,LoginHandler),
    (r‘/register‘,RegisterHandler),
])

# 二级路由映射
application.add_handlers(‘buy.zhangyanlin.com$‘,[
    (r‘/login‘, LoginHandler),
])

if __name__ == "__main__":
    application.listen(8080)
    tornado.ioloop.IOLoop.instance().start()

6.tornado 模板引擎

Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。

Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}

控制语句和对应的 Python 语句的格式基本完全相同。我们支持 ifforwhile 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。

注:在使用模板前需要在setting中设置模板路径:"template_path" : "views"

settings = {
    ‘template_path‘:‘views‘,             #设置模板路径,设置完可以把HTML文件放置views文件夹中
    ‘static_path‘:‘static‘,              # 设置静态模板路径,设置完可以把css,JS,Jquery等静态文件放置static文件夹中
    ‘static_url_prefix‘: ‘/sss/‘,        #导入时候需要加上/sss/,例如<script src="/sss/jquery-1.9.1.min.js"></script>
    ‘cookie_secret‘: "asdasd",           #cookie生成秘钥时候需提前生成随机字符串,需要在这里进行渲染
    ‘xsrf_cokkies‘:True,                 #允许CSRF使用
}
application = tornado.web.Application([
    (r‘/index‘,IndexHandler),
],**settings)                           #需要在这里加载

1、模板语言基本使用for循环,if..else使用,自定义UIMethod以UIModule

import tornado.ioloop
import tornado.web
import uimodule as md
import uimethod as mt

INPUT_LIST = []
class MainHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        name = self.get_argument(‘xxx‘,None)
        if name:
            INPUT_LIST.append(name)
        self.render("index.html",npm = "NPM88888",xxoo = INPUT_LIST)

    def post(self, *args, **kwargs):
        name = self.get_argument(‘xxx‘)
        INPUT_LIST.append(name)
        self.render("index.html", npm = "NPM88888", xxoo = INPUT_LIST)
        # self.write("Hello, World!!!")

settings = {
    ‘template_path‘:‘tpl‘,  # 模板路径的配置
    ‘static_path‘:‘statics‘,  # 静态文件路径的配置
    ‘ui_methods‘:mt,        # 自定义模板语言
    ‘ui_modules‘:md,        # 自定义模板语言
}

#路由映射,路由系统
application = tornado.web.Application([
    (r"/index",MainHandler),
],**settings)

if __name__ == "__main__":
    # 运行socket
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

start.py

1.可添加js,css等东西
"""
from tornado.web import UIModule
from tornado import escape

class Custom(UIModule):
    #渲染到前端的函数
    def render(self, val,*args, **kwargs):

        # #内部会进行转义
        # return "<h1>lujiacheng</h1>"

        #告诉它不转义
        return escape.xhtml_escape("<h1>lujiacheng</h1>")

    #嵌入CSS
    def embedded_css(self):
        pass
        # return "h1{display:None}"

    #导入CSS文件
    #PS:需配置静态文件
    def css_files(self):
        return "login.css"

    #嵌入js
    def embedded_javascript(self):
        pass

    # 导入javascript文件
    # PS:需配置静态文件
    def javascript_files(self):
        pass

uimodule

def func(self,arg):
    return arg.lower()

uimethod

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link type="text/css" rel="stylesheet" href="static/commons.css">
</head>
<body>
    <script src="static/zhang.js"></script>
    <h1>Hello world</h1>
    <h1>My name is zhangyanlin</h1>
    <h1>输入内容</h1>
    <form action="/index" method="post">
        <input type="text" name="xxx">
        <input type="submit" value="提交">
    </form>
    <h1>展示内容</h1>
    <h3>{{ npm }}</h3>
    <h3>{{ func(npm)}}</h3>
    <h3>{% module custom() %}</h3>
    <ul>
        {% for item in xxoo %}
            {% if item == "zhangyanlin" %}
                <li style="color: red">{{item}}</li>
            {% else %}
                <li>{{item}}</li>
            {% end %}
        {% end %}
    </ul>
</body>
</html>

index.html

2、母板继承

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>帅哥</title>
    <link href="{{static_url("css/common.css")}}" rel="stylesheet" />
    {% block CSS %}{% end %}
</head>
<body>

    <div class="pg-header">

    </div>

    {% block RenderBody %}{% end %}

    <script src="{{static_url("js/jquery-1.8.2.min.js")}}"></script>

    {% block JavaScript %}{% end %}
</body>
</html>

layout.html

{% extends ‘layout.html‘%}
{% block CSS %}
    <link href="{{static_url("css/index.css")}}" rel="stylesheet" />
{% end %}

{% block RenderBody %}
    <h1>Index</h1>

    <ul>
    {%  for item in li %}
        <li>{{item}}</li>
    {% end %}
    </ul>

{% end %}

{% block JavaScript %}

{% end %}

index.html

3、导入内容

<div>
    <ul>
        <li>aaaa</li>
        <li>bbbbb</li>
        <li>cccccccccc</li>
    </ul>
</div>

header.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>title</title>
    <link href="{{static_url("css/common.css")}}" rel="stylesheet" />
</head>
<body>

    <div class="pg-header">
        {% include ‘header.html‘ %}
    </div>

    <script src="{{static_url("js/jquery-1.8.2.min.js")}}"></script>

</body>
</html>

index.html

原文地址:https://www.cnblogs.com/lujiacheng-Python/p/10293639.html

时间: 2024-07-31 11:44:16

tornado框架初探的相关文章

[转载]知乎技术方案初探——基于Python的Tornado框架

原文出处:http://nonfu.me/p/5935.html 知乎的整个网站架构图如下: 知乎技术方案 知乎是国内很少的使用Python开发的一个网站,也很多值得我们学习的地方,从知乎让我们也可以了解到一些新的WEB技术. 一.Python框架 知乎目前使用的是Tornado 框架.Tornado 全称Tornado Web Server,是一个用Python 语言写成的Web 服务器兼Web 应用框架,由 FriendFeed 公司在自己的网站FriendFeed 中使用,被faceboo

第二百七十一节,Tornado框架-CSRF防止跨站post请求伪造

Tornado框架-CSRF防止跨站post请求伪造 CSRF是什么 CSRF是用来在post请求时做请求验证的,防止跨站post请求伪造 当用户访问一个表单页面时,会自动在表单添加一个隐藏的input标签,name="_xsrf",value="等于一个密串" 当用户post请求提交数据时,会将_xsrf的密串提交到后台,后台会判断这个密串存在就允许提交数据,否则不允许提交 进行CSRF验证只需要两步 1.在框架配置字典里开启CSRF验证,开启后会自动接收post

tornado框架源码分析---Application类之debug参数

先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A collection of request handlers that make up a web application. Instances of this class are callable and can be passed directly to HTTPServer to serve the a

CI框架初探

2014年7月3日 17:39:35 简易版: index.php->codeIgniter.php->找到控制器类文件并include->创建实例->执行成员函数 详细版本: index.php 包含codeIgniter.php 包含Router.php 找到控制器类文件并include 判断该类是存在&&类名非下划线开头&&类名不和框架中的类名重复 钩子函数pre_controller 创建实例(执行构造函数)存放到变量$CI中 钩子函数pos

Java之Structs框架初探

今天是小白第一次自己的接触Struts框架,因为网上的资料都是从Structs2开始,跟Structs1完全不同,因此,小白直接跳过1学习版本2的搭建,废话不多说,直接开始. 首先要搭建框架,就肯定要导入一定的资源包,通过小白的查询,知道下面的几个包为必要的. 这里要注意的是,这些包要直接放在web-info下的lib文件夹中,不能嵌套,否则会找不到.还有就是版本的问题,小白之前因为选择了2.4版本,会报一个错误 java.lang.NoClassDefFoundError: org/apach

第二百六十二节,Tornado框架-cookie

Tornado框架-cookie Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登 录信息.购物数据信息等一系列微小信息. self.set_cookie()方法,创建cookie必写参数,cookie名称和cookie值,后面有可选参数self.get_cookie()方法,获取指定cookie值,必写参数要获取的cookie名称 模板引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop im

第二百六十九节,Tornado框架-Session登录判断

Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作为一个字典的键,值为一个字典,也就是嵌套字典,键为密串的字典里保存用户信息 3.将这个密串当做cookie值写入浏览器 4.当用户访问时,判断值为密串的cookie是否存在,如果存在,获取cookie的值也就是密串,将这个密串在服务端的字典里查找是否存在,如果存在就可以拿到用户保存的各种信息,判断用

第二百六十七节,Tornado框架-分页封装模块

Tornado框架-分页封装模块 框架引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 from controllers import index settings = { #html文件归类配置,设置一个字典 "template_path":"views", #键为template_path固定的,值为要存放HTML

第二百六十三也,Tornado框架-基于正则的动态路由映射分页

Tornado框架-基于正则的动态路由映射分页 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", index.indexHandler),正则匹配访问路径,访问录index/后面可以是可以是0个或多个数字第二步.配置逻辑处理方法,get()方法里显示对应的页面,并传值一个SHUJU全局变量列表到html模板,这个全局变量列表里是字典显示的数据第三步.在html模板里用模板语言,循环这个列表里的字典,显示到表格里第四步.设置用