tornado学习笔记

Tornado

Tornado 是基于 Python 实现的异步网络框架,它采用非阻塞IO,可以支持成千上万的并发访问量,所以非常适合于长轮询和 Websocket,以及其他需要持久连接的应用场景,因此 Tornado 是实时 Web 服务的一个理想框架。

tornado vs Django

Django:重量级web框架,功能大而全,注重高效开发

内置管理后台
内置封装完善的ORM操作
session功能
后台管理
缺陷:高耦合

Tornado:轻量级web框架,功能少而精,注重性能优越

HTTP服务器
异步编程
WebSocket
缺陷:入门门槛较高

hello world

使用tornado需要先安装扩展,我这里用的是py2.7

用pycharm IDE 写 demo 时直接安装,或者用pip。
pip install tornado

我也是刚开始学,所以在网上找了一个demo,其中每行代码都标有注释。

#-*- coding:utf-8 -*-
import tornado.web
import tornado.ioloop


#定义处理类型
class IndexHandler(tornado.web.RequestHandler):
    #添加一个处理get请求方式的方法
    def get(self):
        #向响应中,添加数据
        self.write('<h1>hello tornado</h1>')

if __name__ == '__main__':
    #创建一个应用对象
    app = tornado.web.Application([(r'/',IndexHandler)])
    #绑定一个监听端口
    app.listen(8888)
    #启动web程序,开始监听端口的连接
    tornado.ioloop.IOLoop.current().start()

main代码块里,前两段代码比较好理解。
1.从list取出路径和对应的handler去创建一个Application对象
2.监听指定的端口(HTTPServer > socket)

tornado.ioloop.IOLoop.current().start()

最后一个对于python初学者来说就比较难理解。
所以这句代码先不做解释,通过网上的资料查阅能知道,这里面主要的操作就是去实现一个单例的ioloop,让他从头到尾只有一个实例。

再看IndexHandler类,它继承了tornado.web.RequestHandler

RequestHandler中定义了很多方法。

a

在这个demo里,它重写了父类的get方法,意思是以GET请求访问“/”这个路径的时候,去执行父类里的write方法。

RequestHandler

这里我列出一些里面常见的方法并作出解释。

get_argument # 获取参数
get_arguments # 获取多个参数
get_query_argument # 获取参数
get_query_arguments # 获取多个参数
get_body_argument # 获取请求体参数
get_body_arguments # 获取多个请求体参数
get_cookie # 获取cookie
get_status # 响应状态

add_header # 添加响应头
set_header # 设置响应头
set_status # 设置响应码
xsrf_form_html # 使用csrf防御功能
write # 输出buffer
redirect # 跳转
URL:http://localhost:8888/?a=1&b=2&b=2&e=5
POST:c=3&d=4&d=4

c.png

b

最后写一个 登录的demo

Server.py

#!/usr/bin/env python
# coding=utf-8

import tornado
import Application


if __name__ == '__main__':
    app = Application.app

    app.listen(8883)

    tornado.ioloop.IOLoop.current().start()

Application.py

#!/usr/bin/env python
# coding=utf-8
import tornado.web
import os
from handle import IndexHandle, LoginHandle

settings = dict(
    template_path = os.path.join(os.path.dirname(__file__), "template"),
    debug = True,
)
path = [
    (r'/',IndexHandle.IndexHandle),
    (r'/login', LoginHandle.LoginHanler),
]
app = tornado.web.Application(handlers= path , **settings)

LoginHanler类

from BaseHandle import BaseHandle
class LoginHanler (BaseHandle):

    def get(self):
        self.render("login.html")
        pass
    def post(self):
        user = self.get_body_argument("username")
        pwd = self.get_body_argument("password")
        if cmp(user , "admin")==0 and cmp(pwd , "123456")==0:
            self.set_cookie("user",user)
            self.redirect("/")
        else:
            self.write("<script>alert('auth error');history.go(-1);</script>")
            pass

IndexHanlde类

#!/usr/bin/env python
# coding=utf-8
import tornado.web
from handle.BaseHandle import BaseHandle
class IndexHandle(BaseHandle):

    def get(self):
        print 1
        if self.getuser() == None:
            self.redirect("/login")
        else:
            return self.render("index.html", user = self.getuser())

BaseHandle类

#!/usr/bin/env python
# coding=utf-8
import tornado.web
class BaseHandle(tornado.web.RequestHandler):

    def getuser(self):
        user = self.get_cookie("user")
        if user!=None:
            return user
        return None

template/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>hello,{{user}}</h1>
</body>
</html>

template/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <form method="post">
            <input type="text" name="username" placeholder="用户名"> <br/>
            <input type="password" name="password" placeholder="密码"><br/>
            <input type="submit" value="登陆"><br/>
        </form>

    </center>
</body>
</html>

参考

https://tornado-zh.readthedocs.io/zh/latest/guide.html

发表留言

如未标注转载则文章均为本人原创,转载前先吱声,未授权转载我就锤爆你狗头。

人生在世,错别字在所难免,无需纠正。