一起使用Flask和Tornado?

时间:2011-11-15 21:06:52

标签: python wsgi nonblocking flask tornado

我是 Flask 的忠实粉丝 - 部分原因是因为它很简单,部分原因是因为它有很多extensions。但是,Flask意味着在WSGI环境中使用,而WSGI不是非阻塞的,因此(我相信)它对于某些类型的应用程序并不像 Tornado 那样扩展。 / p>

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

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

2 个答案:

答案 0 :(得分:87)

我认为我得到了50%的解决方案,饼干尚未经过测试,但现在我可以使用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 将加载烧瓶应用程序和龙卷风服务器的文件+一个简单的龙卷风应用程序,希望没有名为“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()

希望这会帮助那些想要混合它们的人:)

答案 1 :(得分: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

上提到的有关效果的警告