一起使用 Flask 和 Tornado?

Posted

技术标签:

【中文标题】一起使用 Flask 和 Tornado?【英文标题】:using Flask and Tornado together? 【发布时间】:2011-12-29 21:33:47 【问题描述】:

我是 Flask 的忠实粉丝 - 部分是因为它很简单,部分是因为有很多 extensions。但是,Flask 旨在用于 WSGI 环境,而 WSGI 不是非阻塞的,因此(我相信)它在某些类型的应用程序中的扩展性不如 Tornado

由于每个都有一个 URL 调度程序,它将调用一个函数,并且两者都将使用 Python 文件(在 Django 中你不启动 python 文件,但在烧瓶或龙卷风中你会这样做)有两个单独的部分是否有意义?您的网站 - 一部分使用 Tornado 运行非阻塞作业,另一部分使用 Flask 编写?

如果这是个好主意,您会如何在 Flask 和 Tornado 之间共享 cookie/会话?我会遇到问题吗,因为 Flask 将使用它自己的系统,而 Tornado 将使用它自己的系统?

【问题讨论】:

@TimMcNamara 我不知道为什么我会爱上烧瓶!当我开始编写我的第一个教程时,它就是这个框架,它起作用了!我有 2 个月的时间来了解 django 的第一步,因为我认为 django 是 python,而 python 是运行一个文件并查看....而不是如何启动 django 项目的情况;) 我稍微更新了你的问题 - 如果我没有完全正确,请告诉我:-) 完美无瑕,谢谢 :) 现在更专业了 :D 【参考方案1】:

我想我得到了 50% 的解决方案,cookie 尚未测试,但现在我可以使用 Tornado 加载 Flask 应用程序,并将 Tornado + Flask 混合在一起:)

这里首先是 flasky.py 烧瓶应用所在的文件:

from flask import Flask
app = Flask(__name__)

@app.route('/flask')
def hello_world():
  return 'This comes from Flask ^_^'

然后是 cyclone.py 文件,它将加载烧瓶应用程序和龙卷风服务器 + 一个简单的龙卷风应用程序,希望没有名为“旋风”的模块 ^_^

from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop
from tornado.web import FallbackHandler, RequestHandler, Application
from flasky import app

class MainHandler(RequestHandler):
  def get(self):
    self.write("This message comes from Tornado ^_^")

tr = WSGIContainer(app)

application = Application([
(r"/tornado", MainHandler),
(r".*", FallbackHandler, dict(fallback=tr)),
])

if __name__ == "__main__":
  application.listen(8000)
  IOLoop.instance().start()

希望这对想要混合它们的人有所帮助:)

【讨论】:

如何在 Tornado 中添加异步方法?你能在烧瓶路由上使用异步吗? 我知道 Flask 是一个微框架。但是 Tornado 不也是一个微框架吗?但是里面有一个健壮的 http 服务器。假设您不需要担心 WSGI“容器”的潜在交换,为什么不直接使用 Tornado 提供的东西进行开发? Flask 很好,因为它的扩展,一切都在 Flask 上有扩展,所以不需要重新发明***。 @Merlin 我认为这不是一个简单的方法,Flask 使用 WSGI 并且 WSGI 不是异步的。 这真的可行吗?你最终是使用这个,还是只使用 Tornado? @AbdelouahabPp,虽然 Flask 使用 WSGI 并且 WSGI 不是异步的,但是,tornado 可以接受异步连接,然后我们每个请求都可以在不同的线程中运行(我不确定),然后我们可以有异步龙卷风使用 Gunicorn 和同步工作者类,就像 Apache pre-fork 模块一样。【参考方案2】:

基于1 和2,组合的更短的答案是

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":

    from tornado.wsgi import WSGIContainer
    from tornado.httpserver import HTTPServer
    from tornado.ioloop import IOLoop

    http_server = HTTPServer(WSGIContainer(app))
    http_server.listen(8000)
    IOLoop.instance().start()

请考虑2、3 上提到的有关性能的警告

【讨论】:

最好单独使用tornado,而不是flask和tornado结合使用。

以上是关于一起使用 Flask 和 Tornado?的主要内容,如果未能解决你的问题,请参考以下文章

tornado在WIN平台如何多进程启动

Flask即插视图与tornado比较

Centos7部署tornado项目

Flask 可以使用 Tornado Server 的异步功能吗? [复制]

Flask, Tornado, GEvent组合运行与性能比较

比Django和Flask,Tornado还要快的Web框架