Flask Tornado 简单对比

栏目: Python · 发布时间: 6年前

内容简介: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 的结果:

Flask Tornado 简单对比

请求远程 URL 地址的内容并返回:

Flask Tornado 简单对比

使用 ORM 从数据库加载数据渲染模板并返回:

Flask Tornado 简单对比

Reference

Flask Tornado 简单对比

· EOF ·

最近爬虫很是凶猛,标注下文章的原文地址: https://liuliqiang.info/post/flask-vs-tornado-in-simple-way/


以上所述就是小编给大家介绍的《Flask Tornado 简单对比》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

How Great Decisions Get Made

How Great Decisions Get Made

Maruska, Don / 2006-2 / $ 20.28

All too often, solving tough work issues can become a tug of war as clashing departments, priorities, personality styles, and other concerns threaten to destroy any possibility of a successful conclus......一起来看看 《How Great Decisions Get Made》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具