1.tornado是一个异步的http框架
2.常用模块
importtornado.httpserver
importtornado.ioloop
importtornado.options
importtornado.web
这四个都是 Tornado 的模块,在本例中都是必须的。它们四个在一般的网站开发中,都要用到,基本作用分别是:
tornado.httpserver:这个模块就是用来解决 web 服务器的 http 协议问题,它提供了不少属性方法,实现客户端和服务器端的互通。Tornado 的非阻塞、单线程的特点在这个模块中体现。
tornado.ioloop:这个也非常重要,能够实现非阻塞 socket 循环,不能互通一次就结束。
tornado.options:这是命令行解析模块,也常用到。
tornado.web:这是必不可少的模块,它提供了一个简单的 Web 框架与异步功能,从而使其扩展到大量打开的连接,使其成为理想的
3.优化路径,处理post,get请求
import textwrap
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class ReverseHandler(tornado.web.RequestHandler):
def get(self, input):
self.write(input[::-1])
class WrapHandler(tornado.web.RequestHandler):
def post(self):
text = self.get_argument('text')
width = self.get_argument('width', 40)
self.write(textwrap.fill(text, int(width)))
if __name__ == "__main__":
#解析命令行参数
tornado.options.parse_command_line()
#创建应用程序
app = tornado.web.Application(
handlers=[
#(r"/reverse/(\w+)", ReverseHandler),
(r"/", ReverseHandler),
(r"/wrap", WrapHandler)
],
template_path=os.path.join(os.path.dirname(__file__),'templates'),
debug=True
)
#设置http服务器
http_server = tornado.httpserver.HTTPServer(app)
#设置监听端口
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
4.关联 模板
import textwrap
import os
import tornado.web
from tornado.options import define, options
define("port", default=5678, help="run on the given port", type=int)
#自定义方法
def defiend(str):
return '<<%s>>'% str
class BookHandler(tornado.web.RequestHandler):
def get(self):
title = self.get_argument('title',)
self.render(
'book.html',
title=title,
header="books",
books=[
'baiduren',
'huozhe',
'xiaowangzi'
],
tag=defiend
)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/", BookHandler),
],
#设置文件路径
template_path=os.path.join(os.path.dirname(__file__),'templates'),
debug=True
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
5.模板继承,主要在html页面
{%block header%}
this is header
{%end%}
{%block content%}
this is content
{%end%}
{%block footer%}
this is footer
{%end%}
6.tornado设置cookie
#-*- coding:utf-8 -*-
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.options
import os.path
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class BaseHandler(tornado.web.RequestHandler):
#重写父类的方法,如果返回的是真值的说明登录成功
def get_current_user(self):
print("get current user")
return self.get_secure_cookie("username")
class LoginHandler(BaseHandler):
def get(self):
self.render('cookie_login.html')
def post(self):
#设置cookie(标记已经登录)
self.set_secure_cookie("username", self.get_argument("username"))
self.redirect("/")
class WelcomeHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render('cookie_index.html', user=self.current_user)
#清除cookie
class LogoutHandler(BaseHandler):
def get(self):
if (self.get_argument("username", None)):
self.clear_cookie("username")
self.redirect("/")
if __name__ == "__main__":
tornado.options.parse_command_line()
settings = {
"template_path": os.path.join(os.path.dirname(__file__), "templates"),
"cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=",
#设置xsrf防跨站攻击
"xsrf_cookies": True,
"login_url": "/login"
}
application = tornado.web.Application([
(r'/', WelcomeHandler),
(r'/login', LoginHandler),
(r'/logout', LogoutHandler)
], **settings)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()