tornado初步搭建及日志功能的使用

一 为什么用tornado

异步非阻塞,适合高度定制,适合访问量大,异步情况多的网站。

二 简单的tornado的‘Hello World’实现

pip install tornado安装就可以。我安装的环境是win10,python 2.10.1, tornado 5.1。稍微提一下,由于一些原因我是离线安装的,这时候需要下载三个依赖(找到路径 pip install  **.whl)。

tornado初步搭建及日志功能的使用_第1张图片

安装前两个的时候没问题,安装singleDiapathc这个的时候无法安装,报了一个required SIX的错误。后来没办法,又下了一个全文见的,用python setup.py install的方式才安装上的。

下面是官网上给的简单实现的示例。

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

 三 比较成熟的实现和部分参数详解以及tornado_log的实现。

import os
import tornado
import tornado.ioloop
import tornado.httpserver
import tornado.web
import tornado.log
import logging
from tornado.options import options, define

# 这里配置的是日志的路径,配置好后控制台的相应信息就会保存到目标路径中。
options.log_file_prefix = os.path.join(os.path.dirname(__file__), 'logs/tornado_main.log')

# 后台函数
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [  # 路由设置
            (r"/", MainHandler),
        ]

        self.settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), 'templates'),  #设置模板路径
            static_path=os.path.join(os.path.dirname(__file__), 'static'),  # 设置静态资源引用路路径
            # static_url_prefix='/myPath/static/', # 设置html中静态文件的引用路径,默认为/static/
            debug=True,
        )
        super(Application, self).__init__(handlers, **self.settings)


# 格式化日志输出格式
# 默认是这种的:[I 160807 09:27:17 web:1971] 200 GET / (::1) 7.00ms
# 格式化成这种的:[2016-08-07 09:38:01 执行文件名:执行函数名:执行行数 日志等级] 内容消息
class LogFormatter(tornado.log.LogFormatter):
    def __init__(self):
        super(LogFormatter, self).__init__(
            fmt='%(color)s[%(asctime)s %(filename)s:%(funcName)s:%(lineno)d %(levelname)s]%(end_color)s %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )

def main():
    tornado.options.define("port", default="8888", help="run on the port", type=int)  # 设置全局变量port
    tornado.options.parse_command_line()  # 启动应用前面的设置项目
    [i.setFormatter(LogFormatter()) for i in logging.getLogger().handlers]
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(tornado.options.options.port)  # 在这里应用之前的全局变量port
    tornado.ioloop.IOLoop.current().start()  # 启动监听


if __name__ == "__main__":
    main()

项目目录:

tornado初步搭建及日志功能的使用_第2张图片

日志输出样式:

 四 setting中的其他配置

#设置templates路径:
template_path = os.path.join(os.path.dirname(__file__), "templates")

#设置静态文件解析路径:
static_path = os.path.join(os.path.dirname(__file__), "static"),

#设置防跨站请求攻击:
xsrf_cookies = True,
#默认为False,即不可防御。

#设置登陆路径,未登陆用户在操作时跳转会用到这个参数:
login_url = "/login-do",
#默认为@tornado.web.authenticated

#设置调试模式:
debug = True,
#默认为False,即不是调试模式。

#设置cookie密钥:
cookie_secret = "dskfhisdjklagkfdklag;lkjasdklgjkldsjaklgjkldsfksdklf"
#默认为字符串"secure cookies"

#设置是否自动编码:在2.0以上需要设置此项来兼容您之前的APP
autoescape = None,
#不设置默认为自动编码。

#设置template_loader,可以从独立的路径中导入template:
template_loader=utils.ZipLoader,
#其中utils为自己定义的模块,ZipLoader是tornado.template.BaseLoader的子类。

#设置gzip压缩:
gzip=True

#设置静态路径头部:
static_url_prefix = "/mystatic/",
#默认是"/static/"

#设置静态文件处理类:
static_handler_class = MyStaticFileHandler,
#默认是tornado.web.StaticFileHandler

#设置静态文件的参数:
static_handler_args = { "key1":"value1", "key2":"value2" }
#默认为空字典。

#设置日志处理函数
log_function = your_fun,
# 日志处理函数your_fun,按照自己的意图记录日志。

五 踩过的坑

主要是日志的路径设置部分,大家看上面的代码的这一句

tornado.options.define("port", default="8888", help="run on the port", type=int)

这一句主要是同构options模块设置一个全局变量,后面可以通过tornado.options.options.port的形式去调用,这个实现已经体现在前面的代码中。但是我查的时候都说用上面这种方式实现日志路径的改变:

tornado.options.define("log_file_prefix", default="/tmp/tornado_main.log")

但是试了以后是会报错的:tornado.Options: Options 'log_file_prefix' already defined in ....

因为这几个全局变量是存在与系统中的,如果这样去定义是会起冲突的,要通过下面的方式去修改。

options.log_file_prefix = os.path.join(os.path.dirname(__file__), 'logs/tornado_main.log')

六 tornado的一些常用方法

self.write("hello world"):返回数据,常用于返回json数据。write(json.dumps(data))

self.get_argument('key'):获取前端传递参数,get和post都适用。

self.render("test.html", id=1, name='zhangsan'):返回模板和参数传递。

self.request.body:获取请求对象主题,当post请求参数为json时要用这个方法获取,并通过json.loads()解码。

 

 

 

参考:

官网:http://www.tornadoweb.org/en/stable/

格式化日志输出:https://www.jianshu.com/p/8c74a3d87567

setting配置部分:https://yq.aliyun.com/ask/393670

你可能感兴趣的:(Python)