Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the right approach for calling functions after a flask app is run?

I'm a little confused about how to do something that I thought would be quite simple. I have a simple app written using Flask. It looks something like this:

from flask import Flask  app = Flask(__name__)  def _run_on_start(a_string):     print "doing something important with %s" % a_string  @app.route('/') def root():     return 'hello world'  if __name__ == "__main__":     if len(sys.argv) < 2:         raise Exception("Must provide domain for application execution.")     else:         DOM = sys.argv[1]         _run_on_start("%s" % DOM)         app.run(debug=True) 

What I'm finding is that my terminal is outputting the print statements in _run_on_start but non of the other usual Flask app debug code. If I remove the call before app.run, the output is normal. Further I'm finding the output of _run_on_start to be repeated twice on startup, though I don't know if it's some weird output or the function is actually being called twice.

I'm assuming this is not the right way to add a function call before you call app.run. I looked in the Flask docs and found mentions of various decorators one can use, which allow you to execute a function before/after certain requests but I want to execute the call when the app server is run.

Further, I realise that if I call this module from another module, i.e., not when __name__ != "__main__" my I won't get my call to _run_on_start.

What's the right approach here? In both cases when I'm starting from the CL and from another module?

like image 307
Edwardr Avatar asked Feb 14 '12 11:02

Edwardr


People also ask

How do you call a function in a Flask?

Flask – Application Flask constructor takes the name of current module (__name__) as argument. The route() function of the Flask class is a decorator, which tells the application which URL should call the associated function. The rule parameter represents URL binding with the function.

What does Flask response do?

The Flask response class, appropriately called Response , is rarely used directly by Flask applications. Instead, Flask uses it internally as a container for the response data returned by application route functions, plus some additional information needed to create an HTTP response.


2 Answers

Probably you were looking for Flask.before_first_request decorator, as in:

@app.before_first_request def _run_on_start(a_string):     print "doing something important with %s" % a_string 
like image 63
the-happy-hippo Avatar answered Sep 21 '22 09:09

the-happy-hippo


The duplicate output from your function can be explained by the reloader. The first thing it does is start the main function in a new thread so it can monitor the source files and restart the thread when they change. Disable this with the use_reloader=False option.

If you want to be able to run your function when starting the server from a different module, wrap it in a function, and call that function from the other module:

def run_server(dom):         _run_on_start("%s" % dom)         app.run(debug=True, use_reloader=False)  if __name__ == '__main__':     if len(sys.argv) < 2:         raise Exception("Must provide domain for application execution.")     else:         DOM = sys.argv[1]         run_server(DOM) 

The "right approach" depends on what you're actually trying to accomplish here. The built-in server is meant for running your application in a local testing environment before deploying it to a production server, so the problem of starting it from a different module doesn't make much sense on its own.

like image 26
robots.jpg Avatar answered Sep 22 '22 09:09

robots.jpg