闪电龟龟--笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

tornado输入-get_query_argument()等 笔记

Posted on 2018-11-27 00:31  闪电龟龟  阅读(2102)  评论(0编辑  收藏  举报

最外面的代码结构

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()