1

I am running a flask app using celery to offload long running process on a IIS 6.5 server and using python 2.7 The choice of the python 2.7, flask and IIS 7 server are imposed by the Company and cannot be changed.

The flask app works on IIS server (so the server set-up should be correct), except for the following.

I am struggling to find the good implementation to make flask works smoothly on the server. I searched for similar questions on the site, but none helped so far. When I am running the flask app on my pc, the application only performs as expected if I use OPTION A or OPTION B.

OPTION A:

 from flask import Flask
 app = Flask(__name__)

 @app.route("/")
 def hello():
   return "Hello from FastCGI via IIS!"

 if __name__ == "__main__":
   app.run(threaded=True)  # <--- This works

OPTION B:

If I wrap the flask app inside tornado, it works well as well:

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

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

OPTION C:

However if I run the flask app only with the default parameters, then it does not work the webserver is not returning the view that should be returned after a task has been offloaded to celery.

 from flask import Flask
 app = Flask(__name__)

 @app.route("/")
 def hello():
   return "Hello from FastCGI via IIS!"

 if __name__ == "__main__":
   app.run()  # <--- Default App

Example of view working for OPTION A & B but not for OPTION C or on ISS:

Here below a stripped down example of a async task that is picked by celery. Note that I'm using Flask-Classy to generate the views, so the code is slightly different than the traditional routing in Flask.

 class AnalysisView(FlaskView):

    ### Index page ---------------
    def index(self):
      return render_template('analysis.intro.html')

    ### Calculation process ------
    def calculate(self, run_id):
      t_id = task_create_id(run_id)
      current_analysis = a_celery_function.apply_async(args=[x, y], task_id=t_id)
      # Redirect to another view --> Not working when OPTION C or on ISS server
      return redirect(url_for('AnalysisView:inprogress', run_id=run_id))

    ### Waiting page ---------------
    def inprogress(self, run_id=run_id):
      return render_template('analysis.inprogress.html')

My main problem is how can I use OPTION A (preferably, as it involves less change for me) or OPTION B to work together with IIS server? Is there a way to tell flask to run with threaded=True during the Flask() initialization or via config settings?

Thanks in advance for you help.

Julien
  • 231
  • 4
  • 18
  • This Might Help .... http://stackoverflow.com/questions/5072166/how-do-i-deploy-a-flask-application-in-iis – Busturdust May 12 '16 at 13:23
  • Hi, thanks for your answer, but I already try with this url but it is not helping in my case – Julien May 12 '16 at 13:29
  • 3
    Have you read this article http://www.helicontech.com/articles/running-wsgi-on-iis/ ? Flask works via WSGI protocol, so you need your web-server to proxy requests according to this specification – Most Wanted May 23 '16 at 12:27
  • hi MostWanted, your answer solved my problem. could you maybe formulate it in an answer (not a comment) so i can mark it as accepted and give the bounty to you? thanks – Julien May 25 '16 at 14:43

0 Answers0