一、Tornado简介
二、第一个简单应用
import tornado.ioloop
import tornado.web
import tornado.httpserver
import tornado.options
from tornado.options import define, options
#定义端口配置
define('port', type=int, default=8080)
#创建视图处理器
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>hello,world</h1>")
#创建路由表
urls = [(r"/", MainHandler),]
#创建配置-开启调试模式
configs = dict(debug=True)
#自定义应用
class MyApplication(tornado.web.Application):
def __init__(self, urls, configs):
super(MyApplication, self).__init__(handlers=urls, **configs)
#创建服务器
def make_app():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(MyApplication(urls,configs))
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
#启动服务器
if __name__ == '__main__':
make_app()
三、路由
1.多个路由志同一个地址
#创建视图处理器
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>享学课堂-Tornado教程</h1>")
#创建路由表
urls = [
(r"/", MainHandler),
(r"/index",MainHandler)
]
2.带数字参数的路由
class CourseHandler(tornado.web.RequestHandler):
def get(self,cid ):
self.write('<h1>享学课堂-当前课程ID:%d</h1>'%(int(cid)))
#创建路由表
urls = [
(r"/", MainHandler),
(r"/index",MainHandler),
(r'/course/(d+)',CourseHandler),
(r'/course/([0-9]+)',CourseHandler),
]
3.带字符串参数路由
class CourseHandler2(tornado.web.RequestHandler):
def get(self,name ):
self.write('<h1>享学课堂-当前课程名称:%s</h1>'%(name))
#创建路由表
urls = [
(r'/course2/([a-zA-Z]+)',CourseHandler2)
]
4.带中文参数路由
(r'/cdetail/(.*)',CourseDetailHandler)
5.多个参数路由:
class CourseDetailHandler3(tornado.web.RequestHandler):
def get(self, cid, name):
self.write('课程ID:%d<br>课程名称:%s' % (int(cid), name))
urls = [
(r'/course3/(\d+)/(.*)',CourseDetailHandler3)
]
6.带参数名称的路由
7.路由生成器
导入
from tornado.web import url, URLSpec
设置路由名称
urls = [
url(r"/course/(\d+)", CourseHandler,name='course'),
]
使用reverse_url获得路由
class CourseHandler(tornado.web.RequestHandler):
def get(self,cid):
self.write('<h1>享学课堂-当前课程ID:%d</h1>' %(int(cid)) )
self.write(self.reverse_url('course',cid))
四、错误处理
1.使用write_error()方法
2.使用set_status()方法
3.使用tornado.web.HTTPError(error_code)抛出异常
4.自定义错误
import tornado.ioloop
import tornado.web
import tornado.httpserver
import tornado.options
from tornado.options import define, options
define('port', type=int, default=8080)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>享学课堂-Tornado教程</h1>")
class test1Handler(tornado.web.RequestHandler):
def get(self):
self.write_error(404)
class test2Handler(tornado.web.RequestHandler):
def get(self):
self.write_error(500)
class test3Handler(tornado.web.RequestHandler):
def get(self):
self.set_status(500)
class Test4Handler(tornado.web.RequestHandler):
def get(self):
#raise tornado.web.HTTPError(404)
raise tornado.web.HTTPError(status_code=404, log_message='test', reason='Not found page!')
class ErrorHandler(tornado.web.RequestHandler):
def get(self):
self.write('<h3 style="color:red">无效地址!</h3>')
urls=[
(r'/',MainHandler),
(r'/test1',test1Handler),
(r'/test2',test2Handler),
(r'/test3',test3Handler),
(r'/test4',Test4Handler),
(r'/test5',ErrorHandler)
]
#创建配置-开启调试模式
configs = dict(debug=True)
#自定义应用
class MyApplication(tornado.web.Application):
def __init__(self, urls, configs):
super(MyApplication, self).__init__(handlers=urls, **configs)
#创建服务器
def make_app():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(MyApplication(urls,configs))
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
#启动服务器
if __name__ == '__main__':
make_app()
五、请求与响应
1.获得请求参数:
获得单个查询参数
使用RequestHandler的get_argument()或者get_query_argument()可以获得请求的单个参数。
class CourseHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>享学课堂-Tornado教程</h1>")
# arg = self.get_argument('name', default=None)
arg = self.get_query_argument('name', default=None)
self.write('参数是:%s' % arg)
# 路由
urls = [
(r"/", MainHandler),
(r"/course", CourseHandler),
]
# 访问
# http://localhost:8080/course?name=Python3
2.获得多个查询参数
使用RequestHandler的get_arguments()或者get_query_arguments()可以获得请求的多个参数。
class CourseHandler2(tornado.web.RequestHandler):
def get(self):
self.write("<h1>享学课堂-Tornado教程</h1>")
# arg = self.get_arguments('name')
arg = self.get_query_arguments('name')
self.write('参数是:%s' % arg)
# 路由
urls = [
(r"/", MainHandler),
(r"/course2", CourseHandler2),
]
# 访问
# http://localhost:8080/course2?name=1&name=2&name=100
3.获得表单参数
使用RequestHandler的get_argument()/get_arguments()或者get_query_argument()/get_query_arguments()可以获得请求的表单参数。
class LoginHandler(tornado.web.RequestHandler):
def get(self):
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>享学课堂-用户登录</title>
</head>
<body>
<h1>享学课堂-用户登录</h1>
<hr>
<form action="login" method="post">
用户名称:<input type="text" name="username"/><br>
用户密码:<input type="password" name="password"/><br>
<input type="submit" value="登录"/><br>
</form>
</body>
</html>
"""
self.write(html)
def post(self):
username = self.get_argument('username', None)
pwd = self.get_argument('password', None)
print(username)
print(pwd)
self.write('用户名称:%s<br>密码:%s' % (username, pwd))
# 路由
urls = [
(r"/", MainHandler),
(r"/login", LoginHandler),
]
4.设置响应内容类型:
可以使用RequestHandler.set_header(name,value)方法设置信息头来设置响应内容类型。
(1)设置输出为html类型
class TestHtmlHandler(tornado.web.RequestHandler):
def get(self):
self.set_header('content-type', 'text/html')
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>享学课堂</title>
</head>
<body>
<h1>享学课堂</h1>
<hr>
<p>享学课堂,爱学习,更爱分享!</p>
</body>
</html>
"""
self.write(html)
# 路由
urls = [
(r"/", MainHandler),
(r"/html", TestHtmlHandler),
]
(2)设置输出类型为xml
class TestXmlHandler(tornado.web.RequestHandler):
def get(self):
self.set_header('content-type', 'text/xml')
xml = """
<courselist>
<course><name>Python</name></course>
<course><name>Django</name></course>
<course><name>Flask</name></course>
</courselist>
"""
self.write(xml)
# 路由
urls = [
(r"/", MainHandler),
(r"/xml", TestXmlHandler),
(3)设置输出类型为json
class TestJsonHandler(tornado.web.RequestHandler):
def get(self):
self.set_header('content-type', 'application/json')
dic = {'name':'享学课堂', 'site':'2xkt.com', 'course':'Tornado'}
self.write(json.dumps(dic, ensure_ascii=False))
# 路由
urls = [
(r"/", MainHandler),
(r"/json", TestJsonHandler),
]
六、请求重定向
1.使用RequestHandler.redirect()方法进行重定向
class XXKTHandler(tornado.web.RequestHandler):
def get(self):
self.redirect('http://www.2xkt.com')
# 路由
urls = [
(r"/", MainHandler),
(r"/xxkt", XXKTHandler),
]
2.使用tornado.web.RedirectHandler进行重定向
直接在路由表里配置
urls = [
(r"/", MainHandler),
(r"/easy", tornado.web.RedirectHandler, dict(url='http://www.163.com')),
]
3.使用重定向方法下载文件
class DownloadHandler(tornado.web.RequestHandler):
def get(self):
url = 'https://github.com/tornadoweb/tornado/archive/master.zip'
self.redirect(url)
urls = [
(r'/download',DownloadHandler)]
七、同步和异步
1.同步请求:
2.异步请求: