如何在python的Flask中创建实用程序类的通用实例?

时间:2019-07-03 21:02:21

标签: python-3.x flask

我有一个包含多条路线的Flask应用。我定义了一个Utility类,该类几乎没有方法来处理常用功能,例如。获取一些属性等。现在,我想在公共位置创建Utility类的实例,以供每个路由中的函数使用。我该如何实现?

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)

现在,我想做类似的事情-

util_obj = Utility()

在应用程序的开头,因此我可以从任何一条路线中调用实用程序方法,而不必每次都创建对象。

实现此目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您描述的内容似乎与大多数Flask扩展(例如Flask-SQLAlchemy或Flask-Caching)具有相同的结构,即具有一个全局配置的实例,可以在必要时导入或调用该实例。

在大型应用程序中,应将这些实例创建在extensions.py之类的文件中,远离创建app的地方,以避免循环导入,但是对于单个文件,则不要不必担心。相反,我只是将Utility的类定义移至定义app的位置下方,然后在类定义的下方创建util_obj

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)