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

问题描述 投票:0回答:1

我正在使用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对象然后在我的views.py文件中导入它是否更有效率,或在views.py文件中的每个路由中实例化一个新的UserService对象?

python flask sqlalchemy
1个回答
1
投票

看来你只需要UserService类来命名空间,这样你就不需要创建实例了。您可以将方法更改为staticmethods或创建包含这些函数的模块:

# 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()
...

我更喜欢第二种方法,它更干净,更pythonic这样做:

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

# first approach
from userservice import UserService
user = UserService.getUserByName(name)
© www.soinside.com 2019 - 2024. All rights reserved.