异步非阻塞,适合高度定制,适合访问量大,异步情况多的网站。
pip install tornado安装就可以。我安装的环境是win10,python 2.10.1, tornado 5.1。稍微提一下,由于一些原因我是离线安装的,这时候需要下载三个依赖(找到路径 pip install **.whl)。
安装前两个的时候没问题,安装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()
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()
项目目录:
日志输出样式:
#设置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')
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