MuCh
MuCh

Reputation: 113

how can i create a common instance of an utility class in Flask in python?

I have a Flask app with multiple routes. I have defined an Utility class with few methods to handle the common functionalities, for eg. getting some properties etc. Now I want to create and instance of the Utility class in a common place to be used by functions in each route. How do I achieve this ?

from flask import Flask, request, jsonify
import mysql.connector as mariadb

app = Flask(__name__)

@app.route('/aaa/bbb/ccc',methods=['POST'])
def func1():
  pass
@app.route('/xxx/yyy/zzz',methods=['POST'])
def func2():
  pass
@app.route('/abc/dfg/ijk',methods=['POST'])
def func3():
  pass

class Utility:
    def get_properties():
       pass
    def get_database_conn():
       pass

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5000, debug=True)

Now, I want to do something like -

util_obj = Utility()

in the beginning of the app, so that from any of my routes I can call the utility methods without having to create the object every time.

What is the best way to achieve this ?

Upvotes: 1

Views: 979

Answers (1)

Ruben Helsloot
Ruben Helsloot

Reputation: 13129

What you're describing seems to follow the same structure as most extensions to Flask, like Flask-SQLAlchemy or Flask-Caching, namely to have a globally configured instance that you import or call upon when necessary.

In a large scale application, you would create these instances in a file like extensions.py, away from where you create app to avoid circular imports, but in the case of a single file, you don't have to worry about that. Instead, I would simply move the class definition of Utility to just underneath where you define app, and create util_obj right below the class definition.

from flask import Flask, request, jsonify
import mysql.connector as mariadb

app = Flask(__name__)

class Utility:
    def get_properties():
       # you can access app here!
       pass
    def get_database_conn():
       pass

util_obj = Utility()

@app.route('/aaa/bbb/ccc',methods=['POST'])
def func1():
  # you can access util_obj here!
  pass
@app.route('/xxx/yyy/zzz',methods=['POST'])
def func2():
  pass
@app.route('/abc/dfg/ijk',methods=['POST'])
def func3():
  pass

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5000, debug=True)

Upvotes: 1

Related Questions