Tornado(龙卷风)和Django一样是Python中比较主流的web框架,Tornado 和现在的主流 Web 服务器框架也有着明显的区别:Tornado自带socket,并且实现了异步非阻塞并对WebSocket协议天然支持;
一、Tornado框架的基本组成
Tonado由 路由系统、视图、模板语言4大部分组成,如果习惯了使用Django你会感觉它功能单薄,但是只有这样才能足够轻量,如果用到什么功能就自己去GitHub上找现成的插件,或者自实现;以下将对这些基本组件进行逐一介绍。
Django功能概览:
socket:有
中间件:无(使用Python的wsgiref模块)
路由系统:有
视图函数:有
ORM操作:有
模板语言:有
simple_tag:有
cokies:有
session:有
csrf:有
xss:有
其他:缓存、信号、Form组件、ModelFormm、Admin
tornado功能概览:
socket:有(异步非阻塞、支持WebScoket)
路由系统:有
视图函数:有
静态文件:有
ORM操作:无
模板语言:有
simple_tag:有,uimethod,uimodule
cokies:有
session:无
csrf:有
xss:有
其他:无
Django和Tonado功能对比
二、Tornado自带功能
1、Tornado执行流程
#准备安装Tornado: pip install tornado
importtornado.ioloopimporttornado.webclass MainHandler(tornado.web.RequestHandler): #注意继承RequestHandler 而不是redirectHandler
defget(self):
self.write('hellow ,world')
application=tornado.web.Application([
(r'/index/',MainHandler) #路由
])if __name__ == '__main__':
application.listen(8888) #创建1个socket对象
tornado.ioloop.IOLoop.instance().start() #conn,addr=socket.accept()进入监听状态
View Code
第一步:执行脚本,监听 8888 端口
第二步:浏览器客户端访问 /index --> http://127.0.0.1:8888/index/
第三步:服务器接受请求,并交由对应的类处理该请求
第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
第五步:方法返回值的字符串内容发送浏览器
配置文件:
setings={'template_path':'templates',#配置模板路径
'static_path':'static', #配置静态文件存放的路径
'static_url_prefix':'/zhanggen/', #在模板中引用静态文件路径时使用的别名 注意是模板引用时的别名
"xsrf_cookies": True, #使用xsrf认证
'cookie_secret' :'xsseffekrjewkhwy'#cokies加密时使用的盐
}
application=tornado.web.Application([
(r'/login/',LoginHandler) ,#参数1 路由系统
(r'/index/',IndexHandler) ,#参数1 路由系统
],**setings #参数2 配置文件
)
View Code
2、路由系统
2.1、动态路由(url传参数)
app=tornado.web.Application(
[
(r'^/index/$',MainHandler),
(r'^/index/(\d+)$',MainHandler), #url传参
]
)
View Code
2.2、域名匹配
#支持域名匹配 www.zhanggen.com:8888/index/333333
app.add_handlers('www.zhanggen.com',[
(r'^/index/$', MainHandler),
(r'^/index/(\d+)$', MainHandler),
])
View Code
2.3、反向生成url
app.add_handlers('www.zhanggen.com',[
(r'^/index/$', MainHandler,{},"name1"), #反向生成url
(r'^/index/(\d+)$', MainHandler,{},"name2"),
])
路由
classMainHandler(tornado.web.RequestHandler):def get(self,*args,**kwargs):
url1=self.application.reverse_url('name1')
url2= self.application.reverse_url('name2', 666)print(url1,url2)
self.write('hello word')
视图
3、视图
tornado的视图才有CBV模式,url匹配成功之后先 视图执行顺序为initialize 、prepare、get/post/put/delete、finish;
importtornado.ioloopimporttornado.webclassMainHandler(tornado.web.RequestHandler):def initialize(self): #1
print()defprepare(self):pass
def get(self,*args,**kwargs):
self.write('hello word')def post(self, *args, **kwargs):pass
def finish(self, chunk=None):passsuper(self,MainHandler).finish()
View Code
3.1、请求相关
self.get_body_argument('user') :获取POST请求携带的参数
self.get_body_arguments('user_list') :获取POST请求参数列表(如chebox标签和select多选)
self.request.body.decode('utf-8'):获取json数据
self.get_query_argument('user') :获取GET请求携带的参数
self.get_query_arguments('user_list') :获取GET请求参数列表(如chebox标签和select多选)
self.get_argument('user') :获取GET和POST请求携带的参数
self.get_arguments('user_list'):获取GET和POST请求参数列表(如chebox标签和select多选)
注:以上取值方式如果取不到值就会报错,可以设置取不到值就取None;(例如 self.get_argument('user',None))
3.2、响应相关
self.write() :响应字符串
self.render():响应页面
self.redirect():页面跳转
4、模板语言
tornado的模板语言和Python语法一致
View Code
4.1、登录页面
#准备安装Tornado: pip install tornado
importtornado.ioloopimporttornado.webclass LoginHandler(tornado.web.RequestHandler): #注意继承RequestHandler 而不是redirectHandler
defget(self):
self.render('login.html')
setings={'template_path':'templates',#配置模板路径
'static_path':'static', #配置静态文件存放的路径
'static_url_prefix':'/zhanggen/' #在模板中引用静态文件路径时使用的别名 注意是模板引用时的别名
}
application=tornado.web.Application([
(r'/login/',LoginHandler) #参数1 路由系统
],**setings #参数2 配置文件
)if __name__ == '__main__':
application.listen(8888) #创建1个socket对象
tornado.ioloop.IOLoop.instance().start() #conn,addr=socket.accept()进入监听状态
View Code
Title用户名
密码
提交
模板语言
4.2、引入静态文件
通过别名引入静态文件
static_url()方式引入静态文件
通过static_url()方法引入静态文件的好处:
1、使用static_url()可以不用考虑静态文件修改之后造成引用失效的情况;
2、还会生成静态文件url会有一个v=...的参数,这是tornado根据静态文件MD5之后的值,如果后台的静态文件修改,这个值就会变化,前端就会重新向后台请求静态文件,保证页面实时更新,不引用浏览器缓存;
4.3、上下文对象
如果模板语言中声明了变量,上下文对象必须对应传值,如果没有就设置为空,否则会报错;
self.render('login.html',**{'erro_msg':'' }) #模板中声明了变量,视图必须传值,如果没有就设置为空;
View Code
5、xsrf_tocken认证
setings={'template_path':'templates',#配置模板路径
'static_path':'static', #配置静态文件存放的路径
'static_url_prefix':'/zhanggen/', #在模板中引用静态文件路径时使用的别名 注意是模板引用时的别名
"xsrf_cookies": True, #使用xsrf认证
}
配置文件setings={"xsrf_cookies": True, }
Title{%raw xsrf_form_html() %}