python web Tornado框架
1.Tornado
Tornado:python编写的web服务器兼web应用框架
1.1.Tornado的优势
轻量级web框架
异步非阻塞IO处理方式
出色的抗负载能力
优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器
1.2.Tornado VS Django
Django:重量级web框架,功能大而全,注重高效开发
内置管理后台
内置封装完善的ORM操作
session功能
后台管理
缺陷:高耦合
Tornado:轻量级web框架,功能少而精,注重性能优越
HTTP服务器
异步编程
WebSocket
缺陷:入门门槛较高
2.安装
输入命令:
pip install tornado
3.Trnado入门程序
#-*- coding:utf-8 -*-
import tornado.web
import tornado.ioloop
#定义处理类型
class IndexHandler(tornado.web.RequestHandler):
#添加一个处理get请求方式的方法
def get(self):
#向响应中,添加数据
self.write('好看的皮囊千篇一律,有趣的灵魂万里挑一。')
if __name__ == '__main__':
#创建一个应用对象
app = tornado.web.Application([(r'/',IndexHandler)])
#绑定一个监听端口
app.listen(8888)
#启动web程序,开始监听端口的连接
tornado.ioloop.IOLoop.current().start()
python 文件名.py
4.Tornado 代码解析
4.1.入门程序代码解析
tornado.web:tornado的基础web框架
RequestHandler:封装对请求处理的所有信息和处理方法
get/post/..:封装对应的请求方式
write():封装响应信息,写响应信息的一个方法
tornado.ioloop:核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。
current()返回当前线程的IOLoop实例对象
start()启动IOLoop实力对象的IO循环,开启监听
4.2.httpserver底层处理
httpserver监听端口
tornado.httpserver.HTTPServer(app)
httpserver.listen(port)
httpserver实现多进程操作
tornado.httpserver.HTTPServer(app)
httpserver.bind(port)
httpserver.start(0/None/<0/num)
# -*- coding:utf-8 -*-
from tornado.web import Application,RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
class IndexHandler(RequestHandler):
def get(self):
self.write('给自己一点时间,理清所有的荒唐与期望。')
if __name__ == '__main__':
app = Application([(r'/',IndexHandler)])
http_server = HTTPServer(app)
#最原始的方式
http_server.bind(8888)
http_server.start(1)
#启动Ioloop轮循监听
IOLoop.current().start()
4.3.options配置
全局配置
tornado.options.define(
name, default, type, multiple, help
)
命令行参数转换
tornado.options.parse_command_line()
1
#-*- coding:utf-8 -*-
from tornado.web import RequestHandler,Application
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
import tornado.options
#定义变量
tornado.options.define('port',default=8000,type=int,help="this is the port >for application")
class IndexHandler(RequestHandler):
def get(self):
self.write('我们既然改变不了规则,那就做到最好')
if __name__ == '__main__':
app = Application([(r'/',IndexHandler)])
tornado.options.parse_command_line()
http_server = HTTPServer(app)
http_server.bind(tornado.options.options.port)
http_server.start(1)
#启动IOLoop轮循监听
IOLoop.current().start()
配置文件
#即在当前py文件目录创建config文件,并在py代码中加入以下代码,
tornado.options.parse_config_file("./config")
配置模块:跟配置文件类似
4.4.application配置
程序调试之debug配置
#自动重启+取消缓存模板+取消缓存静态文件+提供追踪信息
tornado.web.Application([(..)], debug=True)
注:开发之初可以设置debug=True方便调试,开发完毕改为False.
路由信息初始化参数配置
tonado.web.Application([(r””, Handler, {k:v})])
def initialize(self, k)
路由名称设置及反解析
#名称设置
tornado.web.Application([
url(r””, handler, {k,v}, name=“”)
])
#反解析操作
reverse_url(name)
实例
# -*- coding:utf-8 -*-
from tornado.web import Application, RequestHandler, url
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
class IndexHandler(RequestHandler):
def get(self):
self.write("<a href='"+self.reverse_url("login")+"'>用户登录</a>")
class RegistHandler(RequestHandler):
def initialize(self, title):
self.title = title
def get(self):
self.write("注册业务处理:" + str(self.title))
class LoginHandler(RequestHandler):
def get(self):
self.write("用户登录页面展示")
def post(self):
self.write("用户登录功能处理")
if __name__ == "__main__":
app = Application(
[
(r"/", IndexHandler),
(r"/regist", RegistHandler, {"title": "会员注册"}),
url(r"/login", LoginHandler, name="login"),
]
)
http_server = HTTPServer(app)
http_server.listen(8000)
IOLoop.current().start()
header
.add_header() .set_header() .set_default_headers()
设置响应HTTP头, 前两者的不同点在于多次设置同一个项时, .add_header()会叠加参数, 而.set_header()则以最后一次为准.
.set_default_headers()比较特殊, 是一个空方法, 可根据需要重写, 作用是在每次请求初始化RequestHandler时设置默认headers.
.clear_header() .clear()
.clear_header()清除指定的headers, 而.clear()清除.set_default_headers()以外所有的headers设置.
# add_header
self.add_header('Foo', 'one')
self.add_header('Foo', 'two')
# set_header
self.set_header('Bar', 'one')
self.set_header('Bar', 'two')
# HTTP头的设置结果
# Foo → one, two
# Bar → two
writerror
.send_error()用于发送HTTP错误页(状态码). 该操作会调用.clear() .set_status()
.write_error()用于清除headers, 设置状态码, 发送错误页. 重写.write_error()可以自定义错误页.
# -*- coding:utf-8 -*-
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
class IndexHandler(RequestHandler):
def get(self):
self.write("hello qikuedu.com")
self.send_error(404, msg="页面丢失", info="家里服务器搞对象去了")
def write_error(self, status_code, **kwargs):
self.write("<h1>出错啦,工程师MM正在赶来的途中...</h1>")
self.write("<p>错误信息:%s</p>" % kwargs["msg"])
self.write("<p>错误描述:%s</p>" % kwargs["info"])
数据流
.write()
将数据写入输出缓冲区. 如果直接传入dict, 那Tornado会自动将其识别为json, 并把Content-Type设置为application/json, 如果你不想要这个Content-Type, 那么在.write()之后, 调用.set_header()重新设置就好了. 需要注意的是, 如果直接传入的是list, 考虑到安全问题(json数组会被认为是一段可执行的JavaScript脚本, 且<script src="*/secret.json">可以绕过跨站限制),list将不会被转换成json.
.flush()
将输出缓冲区的数据写入socket. 如果设置了callback, 会在完成数据写入后回调. 需要注意的是, 同一时间只能有一个”等待”的flush callback, 如果”上一次”的flush callback还没执行, 又来了新的flush, 那么”上一次”的flush callback会被忽略掉.
.finish()
完成响应, 结束本次请求. 通常情况下, 请求会在return时自动调用.finish(), 只有在使用了异步装饰器@asynchronous或其他将._auto_finish设置为False的操作, 才需要手动调用.finish().
cookie
页面
.render()
返回渲染完成的html. 调用后不能再进行输出操作.
.redirect()
重定向, 可以指定3xx重定向状态码. 调用后不能再进行输出操作.
# 临时重定向 301
self.redirect('/foo')
# 永久重定向 302
self.redirect('/foo', permanent=True)
# 指定状态码, 会忽略参数 permanent
self.redirect('/foo', status=304)
python web Tornado框架的更多相关文章
- tornado 学习笔记2 Python web主流框架
2.1 Django 官方网址:https://www.djangoproject.com/ 简介:Django is a high-level Python Web framework that e ...
- python web自动化测试框架搭建(功能&接口)——接口用例实现
测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...
- python web自动化测试框架搭建(功能&接口)——接口公共方法
接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...
- python web自动化测试框架搭建(功能&接口)——接口测试模块
Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...
- python web自动化测试框架搭建(功能&接口)——功能测试模块
功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...
- python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集
由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等 TestRunner.py # coding=utf-8 import sys impor ...
- python web自动化测试框架搭建(功能&接口)——通用模块
1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...
- Python web自动化测试框架搭建(功能&接口)——unittest介绍
Python UnitTest测试框架介绍 1) TestCase:所有测试用例类继承的基本类, TestCase的实例就是测试用例 2) TestSuite:测试套件 ...
- python web自动化测试框架搭建(功能&接口)——环境搭建
自动化测试框架一般需要实现以下通用功能 执行前准备 结束后清理 执行步骤输出 执行结果输出 错误.失败截图 测试报告 发送邮件 日志 需要的软件和python第三方库有: 通用: JDK Eclips ...
随机推荐
- C++多线程基础学习笔记(三)
一.detach()大坑 上一篇随笔(二)中提到detach()是用来分离主线程和子线程的,那么需要考虑一个问题,就是如果主线程跑完了,主线程中定义的变量就会被销毁(释放内存),这时回收变量仍作为参数 ...
- SSM @Autowired注入失败
1, Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案 https://blog.csdn.net/weixin_30945319/article/details/9 ...
- [Next] next中文文档
Next.js 是一个轻量级的 React 服务端渲染应用框架. 怎么使用 安装 在项目文件夹中运行: npm install --save next react react-dom 将下面脚本添加到 ...
- 全面解析java编码问题
1.web.xml文件里配置 <filter> <filter-name>CharacterEncodingFilter</filter-name> <fil ...
- spring boot 发布自动生成svn版本号
通过Jenkins构建发布spring boot项目时,常常有需求,需要把Svn的版本号更新到项目的版本上,通过有两种解决方案: 1. 通过shell命令对配置文件中的指定字符进行替换, 如: 配置文 ...
- 第二章 单表查询 T-SQL语言基础(2)
单表查询(2) 2.2 谓词和运算符 T-SQL有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE和HAVING),CHECK约束,等等. 在逻辑表达式中可以使用各种谓词(取值为TR ...
- U盘重装系统
一.准备工作 (1)8G以上空间的U盘一个: (2)将U盘制作好启动工具: 1.下载启动工具制作软件(常用的有:大白菜.电脑店.老毛桃.快启动等等一系列软件,直接百度这些软件的名称,或者百度U盘启动制 ...
- yii的多表查询
获取用户发布消息的指定消息id的总和点赞数 Yii $productIds = ['2260', '2262', '2263', '2268', '2269']; $plSql = Like::fin ...
- RouterOS Firewall v6 流程图
1. Firewall v5和Firewall v6对比图 2.Firewall v6的流程图
- python之SSH远程登录
一.SSH简介 SSH(Secure Shell)属于在传输层上运行的用户层协议,相对于Telnet来说具有更高的安全性. 二.SSH远程连接 SSH远程连接有两种方式,一种是通过用户名和密码直接登录 ...