tornado学习笔记day03-响应输出

write:

作用:

将chunk中的数据写到输出缓冲区

利用write方法写json数据

  • 我们自己手动序列化json的那种方式Content-Type 的属性值为text-html
  • 而我们采用write自动序列化方式,我们的content-type 属性为application/json

set_default_headers():

作用:

  • 在进入HTTP响应方法之前被调用
  • 可以重新写该方法来设置默认的headers

注意:

  • 在这个HTTP处理方法中使用set_header设置的字段会覆盖set_default_headers()的值
  • 这个set_header和set_default_headers()是有执行的先后顺序的,默认那个当然那先就执行了

set_status(status_code,reason=none):

作用:为响应设置状态码

参数:

status_code:

  • 状态码的值,为int类型
  • 如果reason的值为none,则状态码必须为正常值

reason

  • String类型
  • 描述状态码的词组,比如404 not found 中的not found

重定向 self.redirect(url):

作用:

  • 比如你有时候写index,有时候不写,都能进到首页里面,这就是重定向的作用
  • 重定向到url网址

示例:

class RedirectHandler(RequestHandler):def get(self):# 直接就重定向了self.redirect("/")

self.send_error(status_code = 500,**kwargs):

  • 作用:
    • 抛出HTTP错误状态码,默认为500
    • tornado会调用write_error()方法进行处理
    • 对应Django里面自定义404一样

write_error(status_code,**kwargs):

  • 作用:
    • 用来处理send_error抛出的错误信息,并返回给浏览器错误界面
  • 示例:
class ErrorHandler(RequestHandler):def write_error(self, status_code: int, **kwargs: Any) -> None:if status_code == 500:self.write("服务器内部错误500了")elif status_code == 404:self.write("资源不存在")else:self.write("我也不知道是啥错误")def get(self):# 直接就重定向了flag = self.get_query_argument("flag")if flag == '0':print("有错误")self.send_error(500)# 这里抛出错误,下面就不会执行了print("没毛病")self.write("you are right!")

路由的反向解析

这个tornado里面的比Django的反向解析还要简单一点

给路由起个名字,便于url改变后,跳转链接失效

应用端

class Application(tornado.web.Application):def __init__(self):handlers = [(r"/", index.IndexHandler),(r"/sunck", index.SunckHandler,{'name':"victor",'age':19}),# 状态码(r"/status", index.StatusHandler),# 重定向(r"/index", index.RedirectHandler),# 错误处理# iserror?flag=2# 如果等于0就说明,有错误,不等于0就说明没有错误(r"/iserror", index.ErrorHandler),tornado.web.url(r"/kaige",index.KaigeHandler,name='kaige'),]super(Application,self).__init__(handlers)

视图函数

class IndexHandler(RequestHandler):def get(self):self.write("main page info tornado!")self.write("<br>")url = self.reverse_url("kaige")self.write("<a href='%s'>去另一个页面</a>" % (url))# self.write("<a href="+url+">去另一个页面</a>")

tornado.Web.RequestHandler

利用HTTP协议向服务器传递参数

提取uri的特定部分

http://127.0.0.1:8080/good/nice/handsome/cool

实例代码,app部分

''' (r"/good/(\w+)/(\w+)/(\w+)", index.GoodHandler),'''
(r"/good/(?P<p1>\w+)/(?P<p3>\w+)/(?P<p2>\w+)", index.GoodHandler),

视图函数部分

class GoodHandler(RequestHandler):def get(self,p1,p3,p2):self.write("GoodHandler kaige !")self.write("<br>")self.write(p3)self.write("<br>")self.write(p2)self.write("<br>")self.write(p1)                  

查询字符串(GET方式传递参数)

http://127.0.0.1:8080/zhangmanyu?a=1&b=2&c=4类型

这里有一个方法
def get_query_argument(self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,) -> Optional[str]:
参数
name:
  • 从get请求参数中返回指定参数的值
  • 如果出现同名参数,理论上这个方法会返回最后一个值
default
  • 如果我们设置了为未传递name参数,它会返回默认的值
strip
  • 表示是否过滤掉两边的空白字符
  • 默认为True,过滤

http://127.0.0.1:8080/zhangmanyu?a=1&a=2&c=4类型

  • 一般情况下,很少出现这种情况的
  • def get_query_arguments(self, name: str, strip: bool = True) -> List[str]:
  • 参数: 同上

请求体携带数据(POST方式传递参数)

  • 这个厉害了,比Django方便,不用在定义一路由函数了,直接在类里面加一个方法就就行了
  • 原型在这里
def get_body_argument(self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,) -> Optional[str]:

既可以获取GET请求,也可以获取POST请求

  • 直接就上原型就OK了,你不仅要学会举一反三,还要自己进行拓展
  • 原型在这里
def get_argument(  # noqa: F811self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,
) -> Optional[str]:
  • 其实有时候,有的结构,看源码才能理解的更加的深刻
  • 还有一个多个的,也是这么回事儿
def get_arguments(self, name: str, strip: bool = True) -> List[str]:

在HTTP报文头中,增加自定义的字段

request对象

作用

  • 存储了关于请求的相关信息

比如:

  • HTTPServerRequest(protocol='http', host='127.0.0.1:8080', method='GET', uri='/zhuyin', version='HTTP/1.1', remote_ip='127.0.0.1')

属性

  • method: HTTP请求的方式
  • host: 被请求的主机名(服务器的主机名)
  • uri: 请求的完整资源地址,包括路径和get查询的参数部分
  • path: 请求的路径部分
  • query: 请求参数部分
  • version: 使用的HTTP版本
  • headers: 请求的协议头,字典类型
  • body: 请求体数据(POST)
  • remote_ip: 客户端的ip地址
  • files: 用户上传的文件,字典类型

tornado.httputil.HTTPFile对象

  • 功能:在我们上传文件中才能看到他
  • 作用:
    是收到的文件对象

属性:

  • filename: 文件的实际名字
  • body: 文件的数据实体
  • content-type: 上传文件的类型

文件上传

首先,先要滤清一个数据结构,就是request.file对象的数据结构

'''
一个request.file对象的结构示例
{'file': [{'filename': 'a.txt','body': b'suck is a wonderful man','content_type': 'text/plain'},{'filename': 'reg.md','body': b'x9xa0','content_type': 'application/octet-stream'}]'img': [{'filename': 'a.img','body': b'as\dfhg\ahhf\a\\h\ahfh\af','content_type': 'text/plain'}]
}
'''

然后,用循环来进行遍历!

class UpFileHandler(RequestHandler):def get(self):self.render("upfile.html")def post(self):self.write("上传成功!")contents = self.request.filesfor content in contents:fileArr = contents[content]for fileObj in fileArr:file_path = os.path.join(BASE_DIR,"upfile/"+fileObj.filename)with open(file_path,"wb") as f:f.write(fileObj.body)print("文件写入成功")

我知道,要是看不懂那就加一点批注呗!

''' 导入系统操作模块,用于存储接受的文件'''
import os
# 导入BASE_DIR,定位到服务器中的绝对路径
from config import BASE_DIR
from tornado.web import RequestHandlerclass IndexHandler(RequestHandler):def get(self):self.write("main page info tornado!")class UpFileHandler(RequestHandler):'''用于上传文件的视图类,其中包含显示表单的get方法和用于处理上传的POST方法'''# get方法,加载表单模板def get(self):self.render("upfile.html")# 文件上传指定是POST请求啦def post(self):# 用于接收上传的信息self.write("上传成功!")# 通过request.files对象来获取所有文件对象内容contents = self.request.files# 遍历最大的字典,拿到没个name类型的字典的键# 其中content是字典中的键,比如file,imgfor content in contents:# 通过键获取值,拿到相同name的文件列表# 这个filearr,就是一个listfileArr = contents[content]# 遍历文件列表# 这个fileObj又是一个dict字典类型for fileObj in fileArr:# 定义存储路径# 通过BASE_DIR来获取服务器的绝对位置# 其中通过这个fileObj的字典的filename键,# 来获取文件名字,来定义存储路径的文件名称file_path = os.path.join(BASE_DIR,"upfile/"+fileObj.filename)# 写入文件with open(file_path,"wb") as f:# 文件的内容就是bodyf.write(fileObj.body)# TODO 这里还需要处理的就是,用户上传同名文件#  导致文件重新在服务器中覆盖的问题print("文件写入成功")

相似文章

tornado学习笔记day01
tornado学习笔记day02
tornado学习笔记day03
tornado学习笔记day04
tornado学习笔记day05
tornado学习笔记day06
tornado学习笔记day07
tornado学习笔记day08

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Machine Learning——octave矩阵操作(2)——DAY3

矩阵的数学操作&#xff1a; Assumed: a为一个矩阵&#xff0c;m是一个向量 Log(a)——求每一个元素的对数 Exp(a)——以e为底的指数 1./a——求每个元素的导师 [a,b]max(m)——m是一个向量&#xff0c;a为m当中最大的元素&#xff0c;b为a在m中的排列序号&#xff08;已按从小…

python 多进程并发_python并发编程之多进程

一 multiprocessing模块介绍python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源(os.cpu_count()查看)&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。multiprocessing模块用来开启子进程&#xff0c;并在子进程中执…

tornado学习笔记day04-执行顺序

响应输出 -> write 原型 self.write()函数 源码中是这样定义的 def write(self, chunk: Union[str, bytes, dict]) -> None:作用 将chunk数据写到缓冲区 刷新缓冲区的四种方式 程序中断手动刷新缓冲区满了遇到\n 当你写了一个print之后,不是直接就显示在黑屏中断…

字符串中文判断

2019独角兽企业重金招聘Python工程师标准>>> 1、判断字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

angular使用动态组件后属性值_Angular动态加载组件

引言有时候需要根据URL来渲染不同组件&#xff0c;我所指的是在同一个URL地址中根据参数的变化显示不同的组件&#xff1b;这是利用Angular动态加载组件完成的&#xff0c;同时也会设法让这部分动态组件也支持AOT。动态加载组件下面以一个Step组件为示例&#xff0c;完成一个3个…

分治2--取余运算

分治2--取余运算 一、心得 二、题目和分析 题目描述 输入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k为长整型数。输入 三个整数&#xff0c;分别为b&#xff0c;p&#xff0c;k的值输出 bp mod k样例输入 2 10 9样例输出 …

-mysql-锁机制分为表级锁和行级锁

2019独角兽企业重金招聘Python工程师标准>>> 声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 mysql锁机制分为表级锁和行级锁 …

tornado学习笔记day05-访问数据库

模板## 配置模板路径 这个在之前我们已经配置好了,可以参考前面的文章 settings {# 就像upfile就没有,你写了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回给客户端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面开发案例_使用Electron开发基于Node.js的桌面应用

最近小编在查看分享资料时&#xff0c;发现一个可以开发跨平台桌面应用的框架——NW.js(原名&#xff1a;node-webkit)。正当小编兴致勃勃的研究NW.js的时候&#xff0c;最基础的安装环节出了问题。无论用npm还是cnpm都无法完整下载所依赖的包(具体原因待考察)。鉴于此&#xf…

x264_param_t结构体参数分析

参考网上的一些资料&#xff0c;结合个人的理解&#xff0c;对x264中x264_param_t结构体作了初步的分析&#xff0c;不保证正确。对x264熟悉的朋友可以在这基础上修改添加typedef struct x264_param_t{/* CPU 标志位 */unsigned int cpu;int i_threads; /* 并行编…

知识点总结

1、把一个类转换成一个xml&#xff0c;首先&#xff0c;类名前需要加特性&#xff0c;[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")]&#xff0c;[XmlRoot("Org")]&#xff0c;里边的名字为根节点的名字&#xff0c;对各个属性…

tornado学习笔记day06-应用安全

应用安全 cookie 普通cookie 一般我们的用户表中都有啥呢 你在购物的时候,加入购物车,让你登录,那你登录之后,他怎么知道你登录了呢 token 这个值是随机的,存在cookie里面 设置 原型: 设置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…

托福试卷真题_干货解答考生疑惑,自考真题考过了还会在出吗?

重视真题&#xff01;重视真题&#xff01;重视真题&#xff01;重要的话要说三遍。想自考的你们一定要注意&#xff0c;对于历年真题&#xff0c;从来都是“备考必做”的态度。做自考真题&#xff0c;除了可以让自己尽快熟悉考试题型和考点外&#xff0c;还有什么好处呢&#…

x264 struct学习 1

x264_t 结构体维护着CODEC的诸多重要信息 其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧&#xff0c;其类型已经确定&#xff1b;next是尚未确定类型的帧&#xff1b;unused用于回收不使用的frame结构体以备今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己还是太菜&#xff0c;补题离不开题解。。。 但还是留个博客&#xff0c;万一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇见&#xff0c;学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列&#xff0c;旋转后就可以通过…

tornado学习笔记day07-同步与异步

同步 概念 同步就是按部就班的依次执行我们的代码 进阶 但是有些情况我们有一些比较耗时的从操作,比如去别的地方拿点资源,去其他网站请求数据,去访问数据库,上传文件等等,所以这里面优点瑕疵,有小编一一道来 比如这样 本模块的功能:<同步异步demo># 这个就相等于一个…

关键字: on

关键字: on 数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条…

天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险

近日&#xff0c;天融信阿尔法实验室在JSOF实验室发布的由Treck公司开发的TCP/IP软件库中获取到一系列0day漏洞。JSOF实验室发布的这批漏洞共计19个&#xff0c;被JSOF研究人员称为"Ripple20"。受此软件库影响的产品数量估计超过数亿&#xff0c;其中包括智能家居设备…

Service-Oriented Architecture,SOA(转)

http://blog.csdn.net/WOOSHN/article/details/8036910 介绍&#xff1a; IT体系结构已非常成熟&#xff0c;它是一种成功处理典型IT问题的方法。体系结构中一个受到很大重视且相对较新的分支是面向服务的体系结构(SOA)。SOA经常被吹捧为企业用于解决应用程序灵活性和高维护成本…

tornado学习笔记day08-tornado中的异步

概述 应为epoll主要用来解决网络的并发问题,所以tornado中的异步也是主要体现在网络的IO异步上,即异步web请求 tornado.httpclient.AsyncHTTPClient tornado提供异步web请求客户端,可以用来进行异步web请求, 这个客户端和服务端是相对来说的,当tornado的Handler去其他位置去…