Как правильно интегрировать другой сервис в django - PullRequest
1 голос
/ 23 марта 2020

У меня есть приложение 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 секунд, я не могу сделать это при каждом запросе. Как я могу сохранить экземпляр этого класса общим, а не делать это каждый раз? У меня может быть решение, использующее синглтон и / или инициализирующее его в подобных файлах настроек, но я думаю, что есть лучший способ сделать это.

Я знаю, что на производстве может быть несколько рабочих, поэтому несколько экземпляров , но я согласен с этим.

Еще один вопрос: как все это можно сделать выше, с учетными данными соединений из модели базы данных (поэтому не при django запуске, но в любое время)

Я совершенно новичок в экосистеме django, все, что я обнаружил в слое обслуживания, было все о django моделях. Я хочу сделать тот же интерфейс, который я сделал бы для моделей на обычном уровне обслуживания, но работая над чем-то, кроме django моделей.

Я думаю, что само соединение LDAP не должно быть, только методы CRUD , но я не знаю, где его разместить и как заставить django взаимодействовать с.

Заранее спасибо за ваши предложения:)

1 Ответ

1 голос
/ 28 марта 2020

Вы можете использовать запрограммированную фабричную функцию :

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, и облегчает тестирование класса обслуживания.

Кроме того, может быть, лучше было бы отправить низкоуровневую логику соединения c другому классу, скажем

class LDAPConnection:
  def __init__(self, host: str, user: str, password: str, ssl: bool = True):
    ...

, и тогда ваш уровень обслуживания примет это как зависимость во время выполнения ( Внедрение зависимостей )

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
    ...

Это позволяет различным соединениям выставлять один и тот же интерфейс.

Вы можете построить из этих двух идей (внедрение зависимостей и кэширование), чтобы получить более сложные общие структуры ремонтопригодным способом.

...