Tornado

一、路由进阶

路由语法和参数

在路由列表的路由成员中,我们一共可以设置4个参数

url(r"/uri路径", 视图类, {“参数名”:“参数值”}, name=“路由别名”)

server.py

from tornado import web
from tornado import ioloop
settings = {'debug': True,
}class Home(web.RequestHandler):def initialize(self,company)-> str:# initialize 初始化方法[钩子方法]self.company = companydef get(self):print(self.company)print("uri路径:%s" % self.reverse_url("home") ) # 对路由别名进行 反解析self.write("hello,get")def post(self):print(self.company)from tornado.web import url
urls = [# (r"/", Home), # 这个格式的路由其实是简写模式, 在tornaodo.web中内部中最终由 _ApplicationRouter 的 Rule来进行封装和匹配路由和视图的关系# url(pattern=路由uri地址, handler=视图类,kwargs=提供给视图类的公共参数,name="路由别名,用于反解析"),url(pattern=r"/abc", handler=Home,kwargs={"company":"OldBoyEdu"},name="home"),
]if __name__ == '__main__':app = web.Application(urls,**settings)app.listen(port=8888)ioloop.IOLoop.current().start()

二、视图进阶

1.视图中内置的钩子方法

在tornado提供的视图类中,我们除了可以编写客户端http请求对应名称的视图方法和初始化方法initialize以外,还提供了一个预处理方法prepareon_finish,prepare方法会在http请求方法执行之前先执行,on_finish会在http响应完成时进行。
server.py,代码:

from tornado import ioloop
from tornado import web
from tornado.httpserver import HTTPServer
from tornado.options import define, options, parse_command_line
from tornado.web import url
settings = {'debug': True,
}define("port", default=8888, type=int, help="设置监听端口号,默认为8888")class Home(web.RequestHandler):def prepare(self):print(self.request.headers.get("Content-Type"))if self.request.headers.get("Content-Type","").startswith("application/json"):import jsonself.json_data = json.loads(self.request.body)self.is_json = Trueelse:self.is_json = Falseself.json_data = Nonedef post(self):if self.is_json:print(self.json_data)self.write("hello,post")def on_finish(self):print("请求处理结束!可以在此进行收尾工作,例如:记录日志等")# 设置路由列表
urls = [(r"/", Home),
]if __name__ == "__main__":# 创建应用实例对象parse_command_line()app = web.Application(urls, **settings)server = HTTPServer(app)# 设置监听的端口和地址server.listen(options.port)server.start(1)ioloop.IOLoop.current().start()

2.视图方法调用顺序

from tornado import ioloop
from tornado import web
from tornado.httpserver import HTTPServer
from tornado.options import define, options, parse_command_line
from tornado.web import url
settings = {'debug': True,
}define("port", default=8888, type=int, help="设置监听端口号,默认为8888")class Home(web.RequestHandler):def initialize(self):print("initialize执行了")def prepare(self):print("prepare执行了")def set_default_headers(self):print("set_default_headers执行了")def get(self):self.write("hello,get")print("视图http方法执行了")# self.send_error(200,msg="注意:丢炸弹了")  # 此处抛出错误def write_error(self, status_code, **info):print("write_error执行了,msg=%s" % info["msg"])def on_finish(self):print("on_finish执行了")# 设置路由列表
urls = [(r"/", Home),
]if __name__ == "__main__":# 创建应用实例对象parse_command_line()app = web.Application(urls, **settings)server = HTTPServer(app)# 设置监听的端口和地址server.listen(options.port)server.start(1)ioloop.IOLoop.current().start()

当视图中没有任何异常时,执行顺序:

set_defautl_headers()
initialize()
prepare()
视图http方法()
on_finish()

当视图中抛出异常错误时,执行顺序:

set_default_headers()
initialize()
prepare()
视图http方法()
set_default_headers()
write_error()
on_finish()

3.冲刷缓存

在前面的学习中,我们使用了self.write()来完成数据的响应。

事实上,在tornado提供的视图操作中,视图中提供了一个 _write_buffer列表用于暂时缓存提供给客户端的数据, 这个 _write_buffer就是输出缓冲区

self.write()本质上来说是将chunk数据块写到输出缓冲区中。所以才出现在视图中多次调用self.write()输出数据的情况,因为self.write根本没有输出数据,而是把数据写入到了输出缓冲区里面. 如果没有其他操作干预的情况下,则视图方法处理完成以后,会讲输出缓冲区中所有的数据冲刷出来响应给客户端。

除了self.write()方法以外,tornado还提供了2个方法用于在视图中冲刷缓存数据到客户端的。

self.flush() 立刻把数据从输出缓冲区冲刷出去。

self.finish()立刻把数据从输出缓冲区冲刷出去。但是与self.flush()不同的是, self.finish()执行了以后, 后面的所有输出调用都不在支持.也就不能返回给客户端。

server.py,代码:

from tornado import ioloop
from tornado import web
from tornado.httpserver import HTTPServer
from tornado.options import define, options, parse_command_line
settings = {'debug': True,
}define("port", default=8888, type=int, help="设置监听端口号,默认为8888")class Home(web.RequestHandler):def get(self):import timeself.write("hello,get1")self.flush()time.sleep(3)self.write("hello,get2")self.flush()time.sleep(3)self.write("hello,get3")self.flush()self.finish("这里一般不写任何内容,表示视图处理结束")self.write("hello,get4")# 设置路由列表
urls = [(r"/", Home),
]if __name__ == "__main__":# 创建应用实例对象parse_command_line()app = web.Application(urls, **settings)server = HTTPServer(app)# 设置监听的端口和地址server.listen(options.port)server.start(1)ioloop.IOLoop.current().start()

4.用户认证

tornado提供了装饰器tornado.web.authenticated与视图内置方法get_current_user允许我们轻松的实现用户认证功能。

装饰器authenticated依赖于请求处理类中的self.current_user属性来进行判断用户是否通过认证,如果self.current_user值为假(None、False、0、""等),任何GET或HEAD请求都将把访客重定向到settings配置中login_url设置的URL,而非法用户的POST请求将返回HTTPError(403)异常, Forbidden。

server.py,代码:

from tornado import web
from tornado import ioloop
settings = {'debug': True,# 登录页面的url地址"login_url": r"/login"
}from tornado.web import authenticatedclass HttpRequest(web.RequestHandler):def get_current_user(self):username = self.get_argument("username", "")password = self.get_argument("password", "")if username == "root" and password == "123":return usernameclass Home(HttpRequest):@authenticateddef get(self):self.write("hello,用户个人中心")@authenticateddef post(self):self.write("hello,用户中心")class UserLogin(web.RequestHandler):def get(self):self.write("登录页面")urls = [(r"/", Home),(settings["login_url"], UserLogin),
]if __name__ == '__main__':app = web.Application(urls,**settings)app.listen(port=8888)ioloop.IOLoop.current().start()

先访问:http://127.0.0.1:8888/?username=root&password=123
再访问:http://127.0.0.1:8888/

三、模板语法

1.基本语法

①变量、表达式与自定义函数

server.py,代码:

from tornado import ioloop
from tornado import web
from tornado.options import define, options, parse_command_line
import os
settings = {'debug': True,# 静态文件保存路径"static_path": os.path.join(os.path.dirname(__file__), 'static'),# 静态文件url地址前缀"static_url_prefix":"/static/", # 必须前后有斜杠"template_path": os.path.join(os.path.dirname(__file__), 'templates'),
}define("port", default=8888, type=int, help="设置监听端口号,默认为8888")def money_format(data):return "%.2f" % dataimport time
class Home(web.RequestHandler):def get(self):data = {"name":"xiaoming","money": 100,"address":["北京市","昌平区","白沙路地铁站"]}info = {"name":"xiaoming"}self.render("index.html",time=time,info=info,money_format=money_format,**data)# 设置路由列表
from tornado.web import url
urls = [url(r"/", Home,{}, name="home"),
]if __name__ == "__main__":# 创建应用实例对象parse_command_line()app = web.Application(urls, **settings)# 设置监听的端口和地址app.listen(options.port)# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环ioloop.IOLoop.current().start()

templates/index.html,代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{# 模板注释 #}<p>name={{name}}</p><p>name={{info['name']}}</p><p>{{"-".join(address)}}</p><p>{{money_format(money)}}</p>
</body>
</html>

②控制语句

# 判断
{% if ... %}
{% elif ... %}
{% else ... %}
{% end %}# 遍历
{% for ... in ... %}
{% end %}# 循环
{% while ... %}
{% end %}

2.内置标签或函数

①内置标签

# 导包
{% from ... import ... %}
{% import ... %}
# 加载其他模板
{% include ... %}
# 输出原始数据
{% raw ... %}# 语句/局部变量
{% set 变量名=变量值 %}# 异常处理
{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}
# 模板继承
{% extends *filename* %}
{% block 模板块名称} {% end %}

②内置函数

# 输出转义数据,tornado在配置中允许通过autoescape=None设置全局转义
{{ escape(text) }}
# 静态文件存储路径
{{ static_url("style.css") }}
# 路由反解析
reverse_url("路由别名")# CSRF防范机制,CSRF也叫XSRF
# tornado开启csrf必须在配置中进行设置 xsrf_cookies = True
# 补充:
# 在前后端分离项目中,客户端可以通过cookie来读取XSRFToken,cookie名称为_xsrf,请求头必须名称:X-XSRFToken
# 在视图方法中可以通过 self.xsrf_token 来获取 XSRFTokentoken
{% module xsrf_form_html() %}

③内置变量

# 客户端请求对象
request

Tornado-02-Tornado、路由进阶、视图进阶(视图中内置的钩子方法、视图方法调用顺序、冲刷缓存、用户认证)、模板语法(基本语法、内置标签或函数)相关推荐

  1. mysql视图view 自增id_MySQL学习笔记之MySQL视图(view)

    一.基本概念 视图(view)是一种虚拟存在的表,作为一个select语句保存在数据字典中,其本身并不包含任何数据.视图的数据来自定义视图的查询中使用的表,使用视图动态获取数据. 基表:创建视图时使用 ...

  2. 《天池龙珠 - SQL训练营》03.SQL进阶:复杂查询方法-视图、子查询、函数等

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql 目录 一.视图 1.1 什么是 ...

  3. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  4. 项目管理进阶--软件开发项目中的团队组成

    #项目管理进阶–软件开发项目中的团队组成 ##项目经理 项目经理负责分配资源,确定优先级,协调与客户和用户之间的交往.总而言之,就是尽量使项目团队一直集中于正确的目标.项目经理还要建立一套工作方法,以 ...

  5. endwith php,辅助函数 | 进阶系列 | Laravel 7 中文文档

    辅助函数 由 学院君 创建于11个月前, 最后更新于 11个月前 版本号 #7 3845 views 0 likes 1 collects 简介 Laravel 自带了一系列 PHP 辅助函数,很多被 ...

  6. python模块介绍-Tornado:Tornado中文文档-概述

    2019独角兽企业重金招聘Python工程师标准>>> 快速链接 tornado-4.1.tar.gz, tornado最新版本 tornado源码@github 邮件列表:讨论.最 ...

  7. nginx tornado php,tornado+nginx+python 微信公众号接入配置

    配置环境:腾讯主机 Ubuntu Server 16.04.1 LTS 64位 需要用到的软件或者包:nginx,tornado框架 xshell6(非必需) 微信公众号测试平台:http://mp. ...

  8. Vue学习笔记02——Vue路由

    Vue学习笔记01--Vue开发基础 一.初识路由 1.路由的作用 Vue的路由是前端路由,可以让组件之间互相切换. 2.vue-router.js文件 Vue的路由使用需要引入vue-router. ...

  9. 3.(基础)tornado的接口调用顺序与模板

    上一节介绍了tornado的请求与响应,这一节介绍tornado的接口调用顺序和模板 首先都有哪些接口呢?作用是什么呢?并且都有的时候,执行顺序是怎么样的呢? 接口 1.initialize,表示初始 ...

最新文章

  1. [html] html5中的form怎么关闭自动完成?
  2. android折叠listview,android – 如何在listview中展开和折叠项目
  3. 开源素材网_22个用于广告素材的开源工具
  4. Java Web学习总结(33)——Java Web 程序员如何转型大数据
  5. 分布式事务键值数据库 TiKV 加入 CNCF 沙箱孵化器
  6. VBA学习笔记(6)--抽取第一列中叫“虹虹”的个人信息
  7. Ubuntu安装Python2.7,nodejs,Redis
  8. JS页面打开方式丶对话框及页面跳转方式
  9. STC51单片机-实验开发装置仿真-物联网应用系统设计
  10. 电容或电感的电压_为什么并联电容器可以提高功率因数,而串联不行?
  11. 2019 拖拉机(双端队列广搜)
  12. 阿里巴巴国际站产品标题的组合和优化方法一览
  13. 戴尔电脑如何下载c语言,EqualLogic PS6000:戴尔的突破、机遇和挑战
  14. Pytorch强化学习玩微信小游戏
  15. 毕业设计 STM32天气预报盒子 - 嵌入式 单片机 物联网
  16. c语言内部收益率,内部收益率 (C++代码)
  17. [学习笔记]Python for Data Analysis, 3E-8.数据整理:连接、合并和重塑
  18. 在macOS上交叉编译arm64的程序并在IOS上运行
  19. pytorch学习之图片处理
  20. 学生党如何选择好的蓝牙耳机呢?蓝牙耳机高性价比点评

热门文章

  1. 获取youku视频源地址
  2. 查找一个领域内的大牛,顶级期刊,顶级会议,高质量Paper的方法
  3. 衡水数控ug编程加工中心机床模具培寻
  4. 阿里巴巴算法面试经验分享(附面试题及答案)
  5. 智能小车差速系统控制
  6. 智慧机场:如何基于EasyCVR建设机场周界入侵安防系统?
  7. 201571030135/201571030137《小学四则运算练习软件软件需求说明》结对项目报告
  8. mdm mam mcm 相关
  9. Double.parseDouble()是什么意思
  10. 3-kafka版本的选择