在Flask应用程序中使用服务进行查询

时间:2018-09-02 06:50:25

标签: python flask sqlalchemy

我正在使用flask和SQLAlchemy,因此,例如,我有一个User类:

class User(UserMixin, Base):
    __tablename__ = 'user'

    id = Column(Integer, nullable=False, autoincrement=True, primary_key=True)
    email = Column(String(100), nullable=False, unique=True)
    password = Column(String(100))
    name = Column(String(100))

现在在我每次进行查询以按ID或名称获取用户的查询时,在我的视图中都是如此。因此我想创建一个名为userService的类并将所有查询放入其中。这样我就可以了:

class UserService():
  def getUserByName(self, name):
     return User.query.filter(User.name == name).first()

   def getUserById(self, id):
      return User.query.get(id)

   def getUserByEmail(self, email):
      return User.query.filter(User.email == email).first()

现在在我的视图中,我每次需要用户时都可以调用UserService类。我使用应用程序工厂,所以我的问题是:在我的create_app函数中实例化UserService对象然后将其导入我的视图中,效率更高吗? .py文件,还是在我的views.py文件的每条路径中实例化一个新的UserService对象?

1 个答案:

答案 0 :(得分:1)

似乎您只需要UserService类用于名称空间,因此您无需创建实例。您可以将方法更改为静态方法,也可以创建包含以下功能的模块:

# userservice.py
class UserService():
    @staticmethod
    def getUserByName(name):
        return User.query.filter(User.name == name).first()

# userservice.py
def getUserByName(name):
    return User.query.filter(User.name == name).first()
...

我更喜欢第二种方法,它更干净,更Python化:

# views.py
import userservice
user = userservice.getUserByName(name)

# first approach
from userservice import UserService
user = UserService.getUserByName(name)