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?
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.
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
from flask import Flask
def create_app():
app = Flask(__name__)
def run_on_start(*args, **argv):
print "function before start"
run_on_start()
return app
app = create_app()
@app.route("/")
def hello():
return "Hello World!"
来源:https://stackoverflow.com/questions/9276078/whats-the-right-approach-for-calling-functions-after-a-flask-app-is-run