最外面的代碼結構
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()