将其他服务集成到 Django 的干净方法是什么
What is the clean way to integrate another service to django
我有一个 Django 3 应用程序,使用 LDAP 服务 class,像这样:
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 秒才能应用,我不能对每个请求都这样做。我怎样才能保持这个 class 的实例共享,而不是每次都完成?我可能有一个使用单例的解决方案,and/or 在类似设置文件中初始化它,但我认为有更好的方法来做到这一点。
我知道在生产中,可能有多个工人,所以多个实例,但我可以接受。
另一个问题:如何使用来自数据库模型的连接凭据完成上述所有操作(所以不是在 django 启动时,而是在任何时候)
我对 django 生态系统是全新的,我发现的关于服务层的东西都是关于 django 模型的。我想做与在常规服务层中为模型做的相同的界面,但要处理 Django 模型以外的东西。
我认为 LDAP 连接本身不应该存在,只有 CRUD 方法,但我不知道该放在哪里,也不知道如何让 django 与之交互。
提前感谢您的建议:)
您可以使用 memoized factory function:
def get_ldap_service() -> LDAPService:
if not hasattr(get_ldap_service, 'instance'):
get_ldap_service.instance = LDAPService(**input_from_somewhere)
return get_ldap_service.instance
这比 Singleton 更干净,并且可以更轻松地测试服务 class。
此外,将低级连接逻辑发送到另一个class,比如
可能是更好的设计
class LDAPConnection:
def __init__(self, host: str, user: str, password: str, ssl: bool = True):
...
然后您的服务层将在 运行 时间 (dependency injection)
将其作为依赖项
class LDAPService:
def __init__(self, connection: LDAPConnection):
self.connection = connection
# CRUD operations
def create_ou(self, base: str, ou_name: str):
# Do operations via self.connection
...
这允许不同的连接公开相同的接口。
您可以从这两个想法(依赖注入和缓存)构建,以可维护的方式获得更复杂的通用结构。
我有一个 Django 3 应用程序,使用 LDAP 服务 class,像这样:
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 秒才能应用,我不能对每个请求都这样做。我怎样才能保持这个 class 的实例共享,而不是每次都完成?我可能有一个使用单例的解决方案,and/or 在类似设置文件中初始化它,但我认为有更好的方法来做到这一点。
我知道在生产中,可能有多个工人,所以多个实例,但我可以接受。
另一个问题:如何使用来自数据库模型的连接凭据完成上述所有操作(所以不是在 django 启动时,而是在任何时候)
我对 django 生态系统是全新的,我发现的关于服务层的东西都是关于 django 模型的。我想做与在常规服务层中为模型做的相同的界面,但要处理 Django 模型以外的东西。
我认为 LDAP 连接本身不应该存在,只有 CRUD 方法,但我不知道该放在哪里,也不知道如何让 django 与之交互。
提前感谢您的建议:)
您可以使用 memoized factory function:
def get_ldap_service() -> LDAPService:
if not hasattr(get_ldap_service, 'instance'):
get_ldap_service.instance = LDAPService(**input_from_somewhere)
return get_ldap_service.instance
这比 Singleton 更干净,并且可以更轻松地测试服务 class。
此外,将低级连接逻辑发送到另一个class,比如
可能是更好的设计class LDAPConnection:
def __init__(self, host: str, user: str, password: str, ssl: bool = True):
...
然后您的服务层将在 运行 时间 (dependency injection)
将其作为依赖项class LDAPService:
def __init__(self, connection: LDAPConnection):
self.connection = connection
# CRUD operations
def create_ou(self, base: str, ou_name: str):
# Do operations via self.connection
...
这允许不同的连接公开相同的接口。
您可以从这两个想法(依赖注入和缓存)构建,以可维护的方式获得更复杂的通用结构。