Python 将另一个服务集成到django的干净方法是什么

Python 将另一个服务集成到django的干净方法是什么,python,django,python-3.x,design-patterns,business-logic,Python,Django,Python 3.x,Design Patterns,Business Logic,我有一个Django 3应用程序,使用LDAP服务类,如下所示: class LDAPService: def init(self, host: str, user: str, password: str, ssl: bool = True): ... def bind(): # The connection is done here, __init__ just sets values .... def create_ou(base:

我有一个Django 3应用程序,使用LDAP服务类,如下所示:

class LDAPService:
    def init(self, host: str, user: str, password: str, ssl: bool = True):
        ...
    def bind():  # The connection is done here, __init__ just sets values
        ....
    def create_ou(base: str, ou_name: str):
        ....
我应该在何处(或何时)初始化服务以在视图中使用它?绑定步骤需要大约2秒钟的时间才能应用,我不能对每个请求都执行绑定。如何保持该类的实例共享,而不是每次都这样做?我可能有一个使用singleton的解决方案,和/或在类似的设置文件中初始化它,但我认为有更好的方法

我知道在生产中,可能有多个工人,所以有多个实例,但我同意

另一个问题:如何使用数据库模型中的连接凭据来完成上述所有操作(所以不是在django启动时,而是在任何时候)

我对django生态系统完全陌生,我发现关于服务层的东西都是关于django模型的。我想为常规服务层中的模型做相同的接口,但要处理django模型以外的其他东西

我认为LDAP连接本身不应该存在,只有CRUD方法,但我不知道将其放置在何处,以及如何使django与之交互

提前感谢您的建议:)

您可以使用:

def get_ldap_service()->LDAPService:
如果不是hasattr(获取ldap服务“实例”):
获取\u ldap\u service.instance=LDAPService(**从某处输入\u)
返回get_ldap_service.instance
这比单例更干净,并允许服务类更容易测试

此外,将低级连接逻辑发送到另一个类可能是更好的设计,例如

class LDAPConnection:
def u uu init uu uu(self,host:str,user:str,password:str,ssl:bool=True):
...
然后,您的服务层将在运行时将其作为依赖项()

类LDAPService:
定义初始化(自,连接:LDAPConnection):
self.connection=连接
#积垢作业
def create_ou(自我,基础:str,ou_名称:str):
#通过自连接进行操作
...
这允许不同的连接公开相同的接口


您可以从这两个想法(依赖项注入和缓存)构建更复杂的通用结构,以便于维护。

现在,我已将该服务重命名为_LDAPService,并在文件中初始化为LDAPService,我在视图中使用它。这是一种变通方法,仍然在问这样一个问题:)嗨,感谢您的详细回复。我想我缺少的是工厂的功能。我还有一个问题:)你在哪里初始化ldapsercie?在我看来,我将使用服务作为实例类,我应该在哪里执行实例操作?(这可能更像是一个django问题),因此您可以对连接或服务本身使用工厂方法。我认为在您的情况下,只将其用于服务本身并为每个请求调用该方法会更简单