Tornado web框架

一、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.异步请求:

猜你喜欢

转载自blog.csdn.net/ly18846188164/article/details/81095096