资讯专栏INFORMATION COLUMN

Tornado-03、Tornado的输入和输出

Flands / 1065人阅读

摘要:接下来我们看看如果是请求,改怎么得到信息首先在之前的中添加下面内容用户名密码在中添加如下代码显示如下和的区别是就是获取服务器数据的意思,是类似于提交数据,往服务器提交数据。

Tornado的输入和输出 1、输入函数

在tornado文件夹下新建文件夹lesson2
在lesson2下新建start1.py写入下列代码


import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

define("port", default=9000, help="run port", type=int)


class TestIndexHandler(tornado.web.RequestHandler):
    def get(self):
        abc = self.get_argument("abc", "no")
        self.write("hello " + abc)
        self.write("
") abc = self.get_arguments("abc") print("the type of abc is %s" % type(abc)) print("the value of abc is %s" % abc) self.write(",".join(abc)) if __name__ == "__main__": tornado.options.parse_command_line() print(options.port) # 打印端口到terminal app = tornado.web.Application( handlers=[ (r"/test", TestIndexHandler), ] ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()

get_argument 函数获取查询字符串或者请求体中的信息

查询字符串:就是在浏览器的地址栏看到的url中“?”后面的字符串

请求体:在POST请求中的body数据,比如表单数据form data、json数据、xml数据

函数原型:(返回具有给定名称的参数的值。返回的值编码始终是unicode

RequestHandler.get_argument(*name*,*default = *,*strip = True *)

参数说明:

如果未提供default 值,则认为该参数是必需的,如果缺少该参数则抛出 MissingArgumentError异常。

如果参数多次出现在url中,我们返回最后一个值。

strip = True,默认为剪切字符串两边的空格

通过get_arguments 函数获取查询字符串或者请求体中的信息

函数原型:返回具有给定名称的参数的值的列表。返回的值始终是unicode,如果参数不存在返回空列表

RequestHandler.get_arguments(name,*strip = True *)

除此之外,还有:

    RequestHandler.get_query_argument(name,default = ,strip = True )
    RequestHandler.get_query_arguments(name,strip = True )
    RequestHandler.get_body_argument(name,default = ,strip = True )
    RequestHandler.get_body_arguments(name,strip = True )

在之前我们都是使用url来获取字符串,通过URI来获取参数的时候有两种风格

#查询字符串风格
http://127.0.0.1:8000/test?abc=weiwei
#符合REST风格的url
http://127.0.0.1:8000/user/weiwei/18

#当时使用REST风格的写法时,路由映射的写法:
(r"/user/(.+)/([1-9]+)", UserHandler), 
#通过url名称不固定的传参 格式为 非零个非换行字符/非零个数字字符
(r"/bookname/(?P.+)/(?P[1-9]+)", BookNameHandler),
#通过url传固定名称的参数,名字固定为name age

#Handler的写法
class UserHandler(tornado.web.RequestHandler):
    def get(self,name,age):
    self.write("---name=%s---age=%s"%(name,age))
    
class BookNameHandler(tornado.web.RequestHandler):
    def get(self, name, age):
        """通过url传入参数名是固定的"""
        print(self.request.remote_ip)
        self.write("-----name=%s --------age=%s-----%s------"%(name, age, self.request.remote_ip))
     

浏览器显示如下


2、输出函数

函数原型:

RequestHandler.write(chunk)

将给定的块写入输出缓冲区。

要将输出写入网络,请使用下面的flush()方法

如果给定的块是字典,我们将其写为JSON,并将响应的Content-Type设置为application/json。(如果要发送JSON作为其他的Content-Type,调用write()后调用set_header )。

请注意,由于潜在的跨站点安全漏洞,列表不会转换为JSON。所有JSON输出都应该包装在字典中。

(r"/write",WriteHandler),

class WriteHandler(tornado.web.RequestHandler):
    def get(self):
        user = {
            "name":"budong",
            "age":18,
        }
self.write(user) #wirte 回去的就是字符串
li = [1,2,3,4]
import json
li = json.dumps(li)# 转成json
self.write(li)
print(repr(li),type(li))
li = json.loads(li) # 转成python
print(repr(li),type(li))

函数原型:

RequestHandler.render(template_name,kwargs)

返回html页面,页面中可以添加变量和函数。

#添加
(r"/html",HtmlHandler),

template_path="templates",

class HtmlHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("hello.html") #html 的文件名
#templates 必须在一个lesson下面,一个文件夹下面,它自己是从起服务这个地方开始找的

在lesson2下新建一个子文件夹并命名为templates (千万别写成了 template 必须和template_path对应)
新建一个html文件命名为hello
html页面如下:




    
    Title


    hello




上面这些就是tornado的输入和输出,从前台获取数据,就是输入,后台把数据返回给前台,就是输出。

接下来我们看看如果是post请求,改怎么得到信息:

首先在之前的html中添加下面内容:

用户名

密码

在HtmlHandler中添加如下代码:

def post(self):
    name = self.get_argument("name","no")
    passwd = self.get_argument("password","no")
    st = "---name=%s---password=%s---"%(name,passwd)
    self.write(st)

显示如下


get和post的区别是:get就是获取服务器数据的意思,post是类似于提交数据,往服务器提交数据。
接下来我们看看,我们可以从前台的请求中获取些什么信息:

(r"/request",MyHandler),

class MyHandler(tornado.web.RequestHandler):
    def get(self):
    print(self.request.remote_ip)


3、附录

本文章总代码


文件结构

start1.py

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

define("port", default=9000, help="run port", type=int)


class TestIndexHandler(tornado.web.RequestHandler):
    def get(self):
        abc = self.get_argument("abc", "no")
        self.write("hello " + abc)
        self.write("
") abc = self.get_arguments("abc") print("the type of abc is %s" % type(abc)) print("the value of abc is %s" % abc) self.write(",".join(abc)) class UserHandler(tornado.web.RequestHandler): def get(self, name, age): self.write("---name=%s---age=%s" % (name, age)) class BookNameHandler(tornado.web.RequestHandler): def get(self, name, age): """通过url传入参数名是固定的""" # print(self.request.remote_ip) # 得到请求主机的IP self.write("-----name=%s --------age=%s-----%s------" % (name, age, self.request.remote_ip)) class HtmlHandler(tornado.web.RequestHandler): def get(self): self.render("hello.html") # html 的文件名 def post(self): name = self.get_argument("name", "no") passwd = self.get_argument("password", "no") st = "---name=%s---password=%s---" % (name, passwd) self.write(st) class MyHandler(tornado.web.RequestHandler): def get(self): print(self.request.remote_ip) if __name__ == "__main__": tornado.options.parse_command_line() print(options.port) # 打印端口到terminal app = tornado.web.Application( handlers=[ (r"/test", TestIndexHandler), (r"/user/(.+)/([1-9]+)", UserHandler), (r"/bookname/(?P.+)/(?P[1-9]+)", BookNameHandler), (r"/html", HtmlHandler), (r"/request", MyHandler), ], template_path="templates", ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()

hello.py




    
    Title


    hello
    

用户名

密码


注:本文章使用的是 pycharm+VMware+ubuntu
tornado文件夹对应ubuntu用户文件夹下的tonado_1文件夹
关于pycharm连接ubuntu的相关问题 详情请见https://segmentfault.com/a/11...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44631.html

相关文章

  • django开发-djangotornado不同

    摘要:中常用的几个框架有等,今天来总结一下和的不同。本文使用的环境是。文件可以加载路由信息和项目配置信息,文件负责启动项目。以上就简单的比较了和几个方面的不同,它们各有优缺点,实际工作中可以根据不同的需求选择不同的框架进行开发。 python中常用的几个web框架有django, tornado, flask等,今天来总结一下django和tornado的不同。工作中django和torna...

    Reducto 评论0 收藏0
  • Tornado-02、编写第一个tornado程序

    摘要:简介是使用编写的一个强大的可扩展的服务器。是一个编写对请求响应的框架。作为程序员,你的工作是编写响应特定条件请求的响应的。注意不能序列化一个列表,但是字典是可以的。 1.Tornado简介 tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。 tornado的...

    silencezwm 评论0 收藏0

发表评论

0条评论

Flands

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<