web-dev-qa-db-fra.com

en utilisant Flask et Tornado ensemble?

Je suis un grand fan de Flask - en partie parce qu'il est simple et en partie parce qu'il a beaucoup de extensions . Cependant, Flask est destiné à être utilisé dans un environnement WSGI, et WSGI n'est pas un non-bloquant, donc (je crois) il ne s'adapte pas aussi bien que Tornado pour certains types d'applications.

Étant donné que chacun a un répartiteur d'URL qui appellera une fonction, et les deux utiliseront les fichiers Python (dans Django vous ne lancez pas le python fichier mais dans flask ou tornade que vous faites), est-il logique d'avoir deux parties distinctes sur votre site Web - une partie exécutant les travaux non bloquants avec Tornado, et l'autre partie écrite avec Flask?

Si c'est une bonne idée, comment feriez-vous pour partager des cookies/sessions entre Flask et Tornado? Vais-je rencontrer des problèmes, car Flask l'utilisera propre système et Tornado utilisera son propre système?

54
Abdelouahab

je pense avoir obtenu 50% de la solution, les cookies ne sont pas encore testés, mais maintenant je peux charger Flask application en utilisant Tornado, et mélanger Tornado + Flask ensemble :)

voici d'abord flasky.py le fichier où l'application flask est:

from flask import Flask
app = Flask(__name__)

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

puis le cyclone.py le fichier qui chargera l'application flask et le serveur tornado + une simple application tornado, j'espère qu'il n'y a pas de module appelé "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 __== "__main__":
  application.listen(8000)
  IOLoop.instance().start()

j'espère que cela aidera quelqu'un qui veut les mélanger :)

87
Abdelouahab

Sur la base de 1 et 2 , la réponse combinée et la plus courte est

from flask import Flask
app = Flask(__name__)

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

if __== "__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()

Veuillez tenir compte de l'avertissement sur les performances qui a été mentionné le 2 ,

4
Ahmad Yoosofan