Как получить django-ldapdb для распознавания источника данных как LDAP - PullRequest
0 голосов
/ 14 ноября 2018

Я следовал инструкциям в django-ldap README , и я не могу заставить django-ldapdb вести себя так, как будто он выполняет запрос LDAP. Следующее было отредактировано на новом экземпляре Django v.2.1.2 с использованием Python 3.7:

Меняется на settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'ldap': {
        'ENGINE': 'ldapdb.backends.ldap',
        'NAME': 'ldaps://my.server',
        'USER': 'cn=some user',
        'PASSWORD': 'somePassword',
    }
}
DATABASE_ROUTERS = ['ldapdb.router.Router']

Новый models.py:

class MyPerson(ldapdb.models.Model):
        base_dn = "ou=people,dc=ucsf,dc=edu"
        object_classes = ['person', 'myPerson]

        uid = fields.IntegerField(db_column='uid')
        displayname = fields.CharField(db_column='displayname')
        eid = fields.CharField(db_column='eid')

        def __str__(self):
            return str(self.uid)

        def _unicode__(self):
            return str(self.uid)

Запрос на мой взгляд. Сначала я попробовал:

result = MyPerson.objects.filter(uid=99894)

Тогда я попробовал:

result = MyPerson.objects.using('ldap').filter(uid=99894)

Запуск сервера разработки Django в отладчике PyCharm. Я вижу, что result получает QuerySet с сообщением:

Unable to get repr for <class 'django.db.models.query.QuerySet'>

Что я имею в виду под "сообщением". Честно говоря, я не уверен, но отладчик показывает это:

enter image description here

Кроме того, кажется, что хотя db член QuerySet является 'ldap', а query показывает SQL-запрос, а не фильтр LDAP. Когда я проследил HTTP-запрос по URL-маршрутизации, представлению, запросу, а затем по результату, я ни разу не увидел, чтобы он делал какие-либо вызовы, связанные с LDAP. Для правильной меры я исказил пароль привязки LDAP, и я не получаю ошибку привязки. Я уверен, что мне не хватает того, что позволяет Django знать, что я хочу работать с LDAP на данном этапе ... Я просто не знаю, что это такое.

1 Ответ

0 голосов
/ 14 ноября 2018

Поскольку LDAP не представляет реляционную базу данных и, как правило, имеет схему, которая создается с помощью конфигурации, а не так, как это было бы с запросами, мне никогда не приходило в голову, что мне нужно запустить manage.py makemigrations и manage.py migrate.(Я относительно новичок в Python и, тем более, в Django. ORM с несколькими источниками данных, которые я использовал и расширял для LDAP в прошлом, не требовали подобной подготовки.) На догадку я выполнил команды manage.pyнад моими моделями LDAP, а затем снова попробовал мой код.Теперь это работает.

FWIW - я работал с PHP Symfony несколько лет и создал ucsf-iam/UcsfLdapOrm.В то время как Symfony также имеет процесс переноса db, поскольку схемы LDAP довольно статичны, когда я писал, что LDAP ORM, я жестко запрограммировал часть того, о чем Django переносит, на лету.Об остальном позаботились аннотации PHP в модельных классах, подобно тому, как Django имеет типы питонических полей и связывает их с типами атрибутов LDAP.Теперь, когда я все это понимаю лучше, у меня появилась более глубокая оценка того, как Django выполняет настройку ORM.

Надеюсь, это будет инструкция для других разработчиков LDAP, переходящих на Python и Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...