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?
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.
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.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With