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('<br>')
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 = <object object>,strip = True )
RequestHandler.get_query_arguments(name,strip = True )
RequestHandler.get_body_argument(name,default = <object object>,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<name>.+)/(?P<age>[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页面如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello
</body>
</html>
上面这些就是tornado的输入和输出,从前台获取数据,就是输入,后台把数据返回给前台,就是输出。
接下来我们看看如果是post请求,改怎么得到信息:
首先在之前的html中添加下面内容:
<form method="post" action="/html">
<p>用户名<br><input type="text" name="name"></p>
<p>密码<br><input type="text" name="password"></p>
<input type="submit">
</form>
在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('<br>')
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<name>.+)/(?P<age>[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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello
<form method="post" action="/html">
<p>用户名<br><input type="text" name="name"></p>
<p>密码<br><input type="text" name="password"></p>
<input type="submit">
</form>
</body>
</html>
注:本文章使用的是 pycharm+VMware+ubuntu
tornado文件夹对应ubuntu用户文件夹下的tonado_1文件夹
关于pycharm连接ubuntu的相关问题 详情请见https://segmentfault.com/a/11...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。