Using additional command line arguments with gunicorn
Question:
Assuming I’m starting a Flask app under gunicorn as per http://gunicorn.org/deploy.html#runit, is there a way for me to include/parse/access additional command line arguments?
E.g., can I include and parse the foo
option in my Flask application somehow?
gunicorn mypackage:app --foo=bar
Thanks,
Answers:
You can’t pass command line arguments directly but you can choose application configurations easily enough.
$ gunicorn 'mypackage:build_app(foo="bar")'
Will call the function “build_app” passing the foo=”bar” kwarg as expected. This function should then return the WSGI callable that’ll be used.
I usually put it in __init.py__
after main()
and then I can run with or without gunicorn (assuming your main()
supports other functions too).
# __init__.py
# Normal entry point
def main():
...
# Gunicorn entry point generator
def app(*args, **kwargs):
# Gunicorn CLI args are useless.
# https://stackoverflow.com/questions/8495367/
#
# Start the application in modified environment.
# https://stackoverflow.com/questions/18668947/
#
import sys
sys.argv = ['--gunicorn']
for k in kwargs:
sys.argv.append("--" + k)
sys.argv.append(kwargs[k])
return main()
That way you can run simply with e.g.
gunicorn 'app(foo=bar)' ...
and your main()
can use standard code that expects the arguments in sys.argv
.
Assuming I’m starting a Flask app under gunicorn as per http://gunicorn.org/deploy.html#runit, is there a way for me to include/parse/access additional command line arguments?
E.g., can I include and parse the foo
option in my Flask application somehow?
gunicorn mypackage:app --foo=bar
Thanks,
You can’t pass command line arguments directly but you can choose application configurations easily enough.
$ gunicorn 'mypackage:build_app(foo="bar")'
Will call the function “build_app” passing the foo=”bar” kwarg as expected. This function should then return the WSGI callable that’ll be used.
I usually put it in __init.py__
after main()
and then I can run with or without gunicorn (assuming your main()
supports other functions too).
# __init__.py
# Normal entry point
def main():
...
# Gunicorn entry point generator
def app(*args, **kwargs):
# Gunicorn CLI args are useless.
# https://stackoverflow.com/questions/8495367/
#
# Start the application in modified environment.
# https://stackoverflow.com/questions/18668947/
#
import sys
sys.argv = ['--gunicorn']
for k in kwargs:
sys.argv.append("--" + k)
sys.argv.append(kwargs[k])
return main()
That way you can run simply with e.g.
gunicorn 'app(foo=bar)' ...
and your main()
can use standard code that expects the arguments in sys.argv
.