最外面的代码结构
import tornado.web import tornado.ioloop import tornado.options import tornado.httpserver from tornado.options import options from tornado.web import RequestHandler # 使用tornado.options定义全局变量 tornado.options.define('port', type=int, default=8000, help="服务器端口") class IndexHandler(RequestHandler): def get(self): self.write('OK') if __name__ == '__main__': options.parse_command_line() # 转换命令行参数,并将其设置在全局变量上 app = tornado.web.Application([ (r'/', IndexHandler), ], debug=True) # debug关联四个启动 http_server = tornado.httpserver.HTTPServer(app) # 监听套间字 http_server.listen(options.port) # 监听端口 tornado.ioloop.IOLoop.current().start() # 循环线程事件
值得注意的是:
debug包含四个内容,分别是:原文件是否被改变/缓存模板是否要消除/静态文件的hash是否消除/和异常捕获,对应:autoreload/compiled_template_cache/static_hash_cache/serve_traceback
get_query_argument()/get_query_arguments()/get_body_argument()/get_body_arguments()
上述四个获取值方法统一参数:(name, default=_ARG_DEFAULT, strip=True)
# name:获取name属性的值
default:设置默认值,如果没有参数传递过来,那么就是用默认值
strip: 去除左右空格
# 使用get方式传递参数 def get(self): # 获取单个键值 get_a = self.get_query_argument('a') # 如果同时传递多个a的参数,那么会采用后面覆盖前面的原则 self.write(get_a) # 其中获取多个使用:get_query_arguments() # 使用post传递参数 def post(self): # 接收单个参数 post_a = self.get_body_argument('a') self.write(post_a) # 其中获取多个参数传递使用get_body_arguments()
使用get_argument()/get_arguments()可以不区分post/get传递方式
def post(self): # 接收单个参数 post_a = self.get_argument('a') self.write(post_a) # 其中获取多个参数传递使用get_arguments()
值得注意的是:使用上述方法获取参数只能够获取headers报头为"application/x-www-form-urlencoded"或者"multipart/form-data"的数据,如果想获取json或者xml方式传递的数据需要使用self.request方式获取
def post(self): self.write(self.request.headers.get('Content-Type')) # 获取“application/json”类型传递 # 如果想获取内容,可以使用self.request.body
上述代码结构还可以这样写
import tornado.web import tornado.ioloop import tornado.options import tornado.httpserver from tornado.options import options from tornado.web import RequestHandler, url tornado.options.define('port', type=int, default=8000, help="服务器端口") class IndexHandler(RequestHandler): def get(self): self.write('<a href="' + self.reverse_url('numhref') +'">href</a>') class HrefUrl(RequestHandler): def initialize(self, new_url): self.new_url = new_url def get(self): # self.write(self.new_url) self.redirect(self.new_url) # 自动跳转百度页面 if __name__ == '__main__': options.parse_command_line() app = tornado.web.Application([ (r'/', IndexHandler), url(r'/num', HrefUrl, {'new_url': 'http://www.baidu.com'}, name='numhref') # 设置关键子参数和使用name ], debug=True) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.current().start()