Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass an arbitrary argument to Flask through app.run()?

Tags:

python

flask

I would like to pass an object to a newly initiated flask app. I tried following the solution from the question: how-can-i-make-command-line-arguments-visible-to-flask-routes

Edit

I would like to take a value that I pick up from initiating the python script from the command line.

ie.

$ run python flaskTest.py -a goo

I am not seeing the difference between this and the solution to the question I am trying to replicate. Edit

Thus, I tried the following:

from flask import Flask

app = Flask(__name__)

print('Passed item: ', app.config.get('foo'))

if __name__ == '__main__':
  from argparse import ArgumentParser

  parser = ArgumentParser()
  parser.add_argument('-a')
  args = parser.parse_args()
  val = args.a

  app.config['foo'] = val
  app.run()

Hoping to get the result...

'Passed item: Goo'

Is there a method for passing an arbitrary object through the initialization with app.run()?

like image 459
Kyle Swanson Avatar asked Jan 19 '18 16:01

Kyle Swanson


People also ask

How do I run a Flask app from the command line?

To run the app outside of the VS Code debugger, use the following steps from a terminal: Set an environment variable for FLASK_APP . On Linux and macOS, use export set FLASK_APP=webapp ; on Windows use set FLASK_APP=webapp . Navigate into the hello_app folder, then launch the program using python -m flask run .


2 Answers

Well the script is executing from top to bottom, so you can't print something you don't have yet. Putting the print statement inside a classic flask factory function allow you to first parse command line, then get your object and then use it:

from flask import Flask

def create_app(foo):
    app = Flask(__name__)
    app.config['foo'] = foo
    print('Passed item: ', app.config['foo'])
    return app

if __name__ == '__main__':
  from argparse import ArgumentParser
  parser = ArgumentParser()
  parser.add_argument('-a')
  args = parser.parse_args()
  foo = args.a
  app = create_app(foo)
  app.run()
like image 160
lee-pai-long Avatar answered Oct 05 '22 22:10

lee-pai-long


So, the problem is that you're trying to access the value before you define it. You would need to do something like this in your case:

from flask import Flask

app = Flask(__name__)
app.config['foo'] = 'Goo'

print('Passed item: ', app.config['foo'])

if __name__ == '__main__':
  app.run()

If you're trying to access that value while loading some third module, you'll need to define the value somewhere ahead of time.

like image 35
cwallenpoole Avatar answered Oct 05 '22 22:10

cwallenpoole