首页 > 其他分享 >[tornado]入门tornado(2): Handler

[tornado]入门tornado(2): Handler

时间:2024-02-18 10:56:06浏览次数:19  
标签:web 入门 get tornado self write Handler age name

Handler是tornado编程中很重要的一环, tornado应用中几乎每一个页面都对应至少一个handler, handler控制着应用后台的业务逻辑

Handler

handler的接口大致可以分为3类 -- 输入, 输出, 流程

input

如何解析前台传来的参数
https://www.tornadoweb.org/en/stable/web.html#input
前台传来的参数/数据包括url参数(query param)和表单参数(form param, json格式), 一般来说存在以下接口:

get_argument(s)

先从post的form(无header)中解析参数, 如果form中没有, 会从url中解析

get_body_argument(s)

解析form(有header)里的参数(json格式数据)

class JsonWithFormHeadersParamHandler(web.RequestHandler):
    async def post(self):
        name = self.get_body_argument("name")
        age = self.get_body_argument("age")
        self.write("name: {}, age: {}".format(name, age))

get_query_argument(s)

解析url带来的参数

class UrlParamHandler(web.RequestHandler):
    async def get(self):
        name = self.get_query_argument("name")
        age = self.get_query_argument("age")
        self.write("name: {}, age: {}".format(name, age))

        self.write('<br/>')
        names = self.get_query_arguments("name")
        ages = self.get_query_arguments("age")
        self.write("names: {}, ages: {}".format(names, ages))

假设url传入参数 name=ana&&age=20&&name=bob&&age=28
name: bob, age: 28
names: ['ana', 'bob'], ages: ['20', '28']

其它类型的参数

比如json格式的参数, 使用request.body, 代码演示具体可以看看 iworkh/tornado/handler/input

有无s的区别

没有s的: 接受两个参数(name和default), 如果default未指定, 则name指代的参数是必须的, 如果丢失会报错; 如果参数传入多次, 则选择最后一次传入的值
有s的: 接受并返回数组格式, 如果传入参数为空, 也会返回空数组

output

https://www.tornadoweb.org/en/stable/web.html#output 建议看这里, 更细致

set_status: 设置状态码
write: 写数据,可以write多次,放缓存中,而不会中断当flush或者finish或者没消息断开时发送
flush: 刷新数据到客户端
finish: 写数据,写完断开了
render/render_string: 模板方式渲染输出
redirect: 重定向
send_error/write_error: 发送错误
render_embed_js/render_embed_css: 嵌入的js和css
render_linked_js/render_linked_css: 链接的js和css

render_xxx和template有关

class OutputDemoHandler(web.RequestHandler):
    async def get(self):
        self.set_status(200)
        self.write("error!!!")
        self.write("warning!!!")
        self.write("<br/>")
        await self.flush()
        await asyncio.sleep(5)
        self.write("success!!!")
        await self.finish("done")

结果是先打印error和warning, 然后换行, 因为flush刷新了数据; 接着5秒过后, 再打印success和done

process

和很多类对象一样, handler也有一个类似生命周期的东西

initialize: 初始化,通过URLSpec可将参数传递到方法
prepare: 在get/post等操作之前,会调用
get/head/post/delete/patch/put/options: 一般业务逻辑处理
on_finish: 在out操作之后,会调用

需要注意的几个点

  • 顺序是 initialize -> prepare -> 一堆函数 -> on_finish
  • initialize需要的参数可以通过Application的handlers域传入 -- 在上一篇tornado学习里也提到过
# 先定义一个类和initialize方法
class ProcessDemoHandler(web.RequestHandler):
    # initialize方法同步
    def initialize(self, dbinfo):
        print("initialize...")
        self.dbinfo = dbinfo
        print("数据库host:{}".format(self.dbinfo['db_host']))
        pass
		
# 这里是需要传入initialize的参数
init_param = {
    'dbinfo': {
        'db_host': 'localhost',
        'db_port': 3306,
        'db_user': 'root',
        'db_password': '123',
    }
}
# 程序入口
if __name__ == '__main__':
    app = web.Application(
		[
		   (r"/?", ProcessDemoHandler, init_param),
		], 
		debug=True
	)
    # ...

其他的handler以及模板

都在这里了 https://www.tornadoweb.org/en/stable/web.html#everything-else

cookie和application

Cookies: https://www.tornadoweb.org/en/stable/web.html#cookies
Application: https://www.tornadoweb.org/en/stable/web.html#application-configuration

标签:web,入门,get,tornado,self,write,Handler,age,name
From: https://www.cnblogs.com/Akira300000/p/18004093

相关文章

  • 5.NET中GRPC服务端快速入门,服务端与客户端
    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,支持负载均衡、跟踪、健康检查和身份验证。它也适用于分布式计算,将设备、移动应用程序和浏览器连接到后端服务1.创建一个空项目GrpcServer安装包:Grpc.AspNe......
  • 算法入门:搜索算法
    文章目录1.二分查找2.深度优先搜索(DFS)3.广度优先搜索(BFS)4.DFS与BFS区别 1.二分查找思想:二分查找是一种高效的查找算法,它基于分治思想,适用于已排序的数组。确定搜索范围:首先确定整个数组的搜索范围,通常是从数组的起始位置到结束位置。计算中间位置:计算搜索范围的中......
  • 【赛后反思】【LGR-175 Div.4】 洛谷入门赛#20 赛后反思
    洛谷入门赛#20赛后反思今日推歌:《水与水之歌feat.绮萱》きくお呆在这里直到精神恍惚为止让我们一起快乐地玩耍我们术术人有自己的《让我们荡起双桨》(大雾Before先看结果(是同步赛的成绩,因为前一天晚上我在死磕dfs):省流:暴力-纯度75%STL-纯度25%展开目录目录洛谷入......
  • Python 装饰器入门
    目录Python函数头等对象内部功能作为返回值的函数Python中的简单装饰器结论Python函数为了理解装饰器,您必须首先了解函数如何工作的一些细节。函数有很多方面,但在装饰器的上下文中,函数根据给定的参数返回一个值。下面是一个基本示例:`>>>defadd_one(number):.........
  • svg半小时全方位入门
    1-svg应用场景和优势canvas快速入门canvas是HTML5的新特性,它允许我们使用canvas元素在网页上通过JavaScript绘制图像。入门案例:绘制矩形、线段、圆、点<!DOCTYPEhtml><html><head></head><body><!--声明canvas画布宽高为800--><canvasid="c......
  • 算法竞赛经典入门(第2版)习题1
    目前在准备一个竞赛,头绪并不是很清楚,根据知乎的推荐入了一本书《算法竞赛入门经典》(第2版)...下面是写的例题和习题答案也算是简单记录一下学习过程吧。//三位数反转#include<stdio.h>intmain(){intn;scanf("%d",&n);printf("%d%d%d\n",n%10,n/10%10,n/100)......
  • 自适应辛普森法从入门到进门
    前言学数学学的。simpson背景我们要计算这样一个式子:\[\int_l^rf(x)\textdx\]显然计算机是很难把柿子推出来的。函数的拟合对于一个奇怪的函数,为了对其求导,我们可以用一个图像近似且容易求导的函数来替代,这个过程叫做拟合。这里我们用二次函数来替代,那么有:\[\beg......
  • 数论从入门到进门
    gcd朴素欧几里得(辗转相除法)这一节我们默认:\(a,b\in\mathbb{Z}\)对于求解\(\gcd(a,b)\)需要用朴素欧几里得定理。\[\gcd(a,b)=\gcd(b,a\bmodb)\]gcd\(\gcd\)为\(\text{greatestcommondivisor}\)的缩写,即最大公约数。(或称最大公因数)对于\(\gcd\)函数,有以下......
  • 多项式从入门到进门
    多项式全家福多项式一个以\(x\)为变量的多项式定义在一个代数域\(F\)上,将函数\(A(x)\)表示为形式和:\[A(x)=\sum\limits_{i=0}^{n-1}a_ix^i\]我们称\(a_0,a_1,\cdots,a_n\)为多项式的系数,所有系数都属于数域\(\mathbbF\)。如果一个多项式的最高次的非零系数是\(k......
  • 生成函数从入门到进门
    引入先看下面这个例子:\[(1+a_1x)\times(1+a_2x)\times\cdots\times(1+a_nx)\]拆括号得:\[1+(a_1+a_2+\cdots+a_n)x+(a_1a_2+a_1a_3+\cdots+a_{n-1}a_n)x^2+\cdots+(a_1a_2\cdotsa_n)x^n\]其中\(x^2\)的系数包含了从\(n\)个元素\(\{a_1,a_2,\cdots,a_n\}\)中选取两个的......