如何将Flask和Tornado一起使用?

57 投票
2 回答
41149 浏览
提问于 2025-04-17 06:23

我非常喜欢Flask,部分原因是它简单,部分原因是它有很多扩展可以使用。不过,Flask是设计用在WSGI环境中的,而WSGI并不是非阻塞的,所以我觉得在某些类型的应用中,它的扩展性不如Tornado

因为这两者都有一个URL调度器,会调用某个函数,而且它们都使用Python文件(在Django中你不需要直接启动Python文件,但在Flask或Tornado中你需要),所以把你的网站分成两个部分是否有意义呢?一个部分用Tornado处理非阻塞的任务,另一个部分用Flask来写?

如果这样做是个好主意,那我该如何在Flask和Tornado之间共享cookies和会话信息呢?会不会遇到问题,因为Flask会用自己的系统,而Tornado会用它自己的系统?

2 个回答

4

根据12的内容,下面是一个合并后的简短回答:

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()

请注意在23中提到的关于性能的警告。

91

我觉得我已经找到了一半的解决办法,虽然还没测试 cookies,但现在我可以用 Tornado 来加载 Flask 应用程序,并且把 Tornado 和 Flask 混合在一起了 :)

首先,这是 flasky.py 文件,里面是 Flask 应用程序的代码:

from flask import Flask
app = Flask(__name__)

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

接下来是 cyclone.py 文件,这个文件会加载 Flask 应用程序和 Tornado 服务器,还有一个简单的 Tornado 应用程序,希望没有叫“cyclone”的模块 ^_^

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()

希望这能帮助到想要把它们结合在一起的人 :)

撰写回答