我已按照 django-ldap README 中的说明进行操作我似乎无法让 django-ldapdb 表现得像进行 LDAP 查询一样。以下内容已在使用 Python 3.7 的 Django v.2.1.2 全新实例上进行了编辑:
对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)
在 PyCharm 的调试器中运行 Django 开发服务器,我可以看到 result
收到一个 QuerySet
,其中包含以下消息:
Unable to get repr for <class 'django.db.models.query.QuerySet'>
“消息”是什么意思?老实说,我不确定,但调试器显示了这一点:
此外,虽然 QuerySet
的 db
成员是“ldap”,并且 query
成员显示 SQL 查询,不是 LDAP 过滤器。当我通过 URL 路由跟踪 HTTP 请求、到 View 、到查询、然后到结果时,我从未见过它进行任何类型的 LDAP 相关调用。为了更好地衡量,我破坏了 LDAP 绑定(bind)密码,但没有收到绑定(bind)错误。很确定我错过了一些让 Django 知道我现在想使用 LDAP 的东西...我只是不知道那是什么。
最佳答案
由于 LDAP 不代表关系数据库,并且通常具有通过配置而不是查询创建的架构,因此我从来没有意识到我需要运行 manage.py makemigrations
和manage.py迁移
。 (我对 Python 比较陌生,对 Django 更陌生。我过去为 LDAP 使用和扩展的多数据源 ORM 不需要类似的准备工作。)凭直觉,我运行了 manage .py
对我的 LDAP 模型执行命令,然后再次尝试我的代码。现在可以了。
FWIW - 我使用 PHP Symfony 工作了几年并创作了 ucsf-iam/UcsfLdapOrm
。虽然 Symfony 也有一个数据库迁移过程,但由于 LDAP 模式相当静态,当我编写 LDAP ORM 时,我对 Django 迁移动态处理的部分内容进行了硬编码。其余的由模型类中的 PHP 注释处理,类似于 Django 如何具有 pythonic 字段类型并将它们与 LDAP 属性类型相关联。现在我更好地理解了这一切,我对 Django 如何进行 ORM 设置有了更深入的了解。
我希望这对其他转向 Python 和 Django 的 LDAP 开发人员有指导作用。
关于python - 如何让 django-ldapdb 将数据源识别为 LDAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291103/