内容简介:Flask Tornado 简单对比
这几天趁着比较空闲就浏览了一遍 Tornado,了解了一下 Tornado 的特性以及主流的使用方法,发现在大体上,Tornado 的使用和 Flask 相差不远,但是,对于 Tornado 的最大的特点——异步却是其他框架所不能及的,本文就以个人的见解出发,对比一下两款 Python 的流行框架:Flask 和 Tornado。
对于一个 Web 框架来说,我觉得有几个方面是需要注意的,分别是:
- 路由
- 请求和响应方式
- session 和 cookie
- 模板
- 扩展性
下面我就以这些方面为切入点对比一下这两款框架:Flask == 0.11.1, Tornado == 4.4.2
路由
Flask 在路由方面选择比较多,常用的有两种方式,一种是 blueprint 方式,还有一种就是类的方式,而 Tornado 就只有一种类的方式,下面就以类的方式分别列举一下两种框架的写法:
Flask View 的类
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users')) |
而 Tornado 中是这样使用的:
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
]) |
以这种方式来说,其实两者差距不大,都挺方便,但是,以模块化以及便利性来说,Flask 的 Blueprint 远胜于类的方式。
请求和响应处理
在 Flask 中关于请求是封装成上下文形式,也就是说不用再处理函数中声明请求对象作为参数,也不用在 View 的类中引用请求对象的属性,无论在何时使用,只需要引用 request 即可,而响应的话,默认情况下只需 return 即可,可以 return 字符串,也可以 return 字典,实在有需要可以 return 封装的 Response 对象。
而 Tornado 在请求上是以继承 RequestHandler 为基础,然后使用 self.get_argument 以及 self.get_secure_cookie 等方式获取请求数据,然后响应的话还是以 RequestHandler 为基础,调用 self.write 输出响应,这个过程会显得原始了一点。
Flask 请求响应示例:
def index():
try:
page = int(request.args.get('page', DEFAULT_PAGE))
current_app.logger.debug("page : {}".format(page))
page_size = DEFAULT_PAGE_SIZE
page_size = max([DEFAULT_PAGE_SIZE, min([MAX_PAGE_SIZE, page_size])])
except Exception:
return srv.abort(404)
post_paginator = post_srv.paginator_post(page, page_size,
POST_STATUS.PUBLISHED)
return render_template('index.html', posts=post_paginator) |
Tornado 请求响应示例:
class MainHandler(tornado.web.RequestHandler):
def get(self):
cookie = self.get_secure_cookie("count")
count = int(cookie) + 1 if cookie else 1
countString = "1 time" if count == 1 else "%d times" % count
self.set_secure_cookie("count", str(count))
self.write(
'<html><head><title>Cookie Counter</title></head>'
'<body><h1>You’ve viewed this page %s times.</h1>' % countString +
'</body></html>'
) |
所以在请求和响应的处理方面,我个人还是比较倾向于 Flask,因为它封装得更为友好便捷。
session 和 cookie
在 session 和 cookie 方面, Flask 的处理方式还是与 Request 一样以上下文变量的形式呈现,而 Tornado 则以 RequestHandler 的方法形式来操作,会显得比较便捷一下。
Flask 示例:
from flask import session
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action="" method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index')) |
Tornado 示例:
class MainHandler(tornado.web.RequestHandler):
def get(self):
cookie = self.get_secure_cookie("count")
count = int(cookie) + 1 if cookie else 1
countString = "1 time" if count == 1 else "%d times" % count
self.set_secure_cookie("count", str(count))
self.write(
'<html><head><title>Cookie Counter</title></head>'
'<body><h1>You’ve viewed this page %s times.</h1>' % countString +
'</body></html>'
) |
模板
Flask 的模板目前是绑定的 Jinja,而 Tornado 是自立模板,虽然这两种框架的模板不一样,但是也各具特色。
jinja 的官方列举特性:
- Sandboxed execution mode.
- powerful automatic HTML escaping system
- High performance with just in time compilation to Python bytecode.
- Optional ahead-of-time compilation
- Easy to debug with a debug system
- Configurable syntax.
- Template designer helpers.
Tornado 模板的官方没有列举特性,但是我了解了一下,发现和 Jinja 模板的语法差不多,但是,有一样很特别的东西就是——UI模块,非常有意思,你可以组件化你的 Html 模板,在这一点上,我就觉得 Tornado 的模板会比 Flask 会更有意思一些。
扩展性
在扩展性方面,Flask 与 Tornado 的方向不太一样,Flask 的扩展性主要在于功能上,而Tornado 的扩展性主要在于性能上。
Flask 的扩展举例:
- Flask-SQLAlchemy
- Flask-Oauth
- Flask-Login
- Flask-Admin
Tornado 的扩展举例
- tornado.ioloop
- tornado.iostream
- tornado.netutil
- tornado.tcpclient
- tornado.tcpserver
关于这方面的选择就见仁见智了,因为可能你的需求不一样,那么选择也就不一样了。
这些都是个人在几天的时间内对 Tornado 框架进行尝试后得出的比较,不具有权威性和官方性,仅供选择参考,但是光说没用,还是上数据,下面就给出两种框架的 BenchMarks,不过注明一下,并非本人的测试结果:
Json 化一个字段为 Json 形式,并返回 meta 为 applicaion/json 的结果:
请求远程 URL 地址的内容并返回:
使用 ORM 从数据库加载数据渲染模板并返回:
Reference
· EOF ·
最近爬虫很是凶猛,标注下文章的原文地址: https://liuliqiang.info/post/flask-vs-tornado-in-simple-way/
以上所述就是小编给大家介绍的《Flask Tornado 简单对比》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
High Performance Python
Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99
If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!