【问题标题】:How to get django-ldapdb to recognize datasource as LDAP如何让 django-ldapdb 将数据源识别为 LDAP
【发布时间】:2018-11-13 23:43:31
【问题描述】:

我已按照 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'>

我所说的“消息”是什么意思。老实说,我不确定,但调试器显示:

此外,尽管QuerySetdb 成员似乎是“ldap”,而query 成员显示的是SQL 查询,而不是LDAP 过滤器。当我通过 URL 路由、视图、查询和结果跟踪 HTTP 请求时,我从未见过它进行任何类型的 LDAP 相关调用。为了更好地衡量,我破坏了 LDAP 绑定密码,但没有收到绑定错误。很确定我错过了一些让 Django 知道我现在想使用 LDAP 的东西......我只是不知道那是什么。

【问题讨论】:

  • 您收到 repr 错误可能是因为您的 str 方法应该返回一个字符串:def __str__(self): return str(self.uid)
  • @UkuLoskit ,感谢您的建议,但没有任何区别。我知道 uid 成员是一个整数变量, str 的用户期待一个字符串。这应该以任何一种方式纠正。但是,是什么让你想到我的问题? (顺便说一句,更改我上面的原始代码以反映此更改)

标签: python django ldap django-ldapdb


【解决方案1】:

由于 LDAP 不代表关系数据库,并且通常具有通过配置而不是通过查询创建的模式,因此我从未意识到我需要运行 manage.py makemigrationsmanage.py migrate。 (我对 Python 比较陌生,对 Django 更是如此。我过去为 LDAP 使用和扩展的多数据源 ORM 不需要类似的准备工作。)凭直觉,我运行了 manage.py 命令通过我的 LDAP 模型,然后再次尝试我的代码。现在它起作用了。

FWIW - 我使用 PHP Symfony 工作了几年,并撰写了 ucsf-iam/UcsfLdapOrm。虽然 Symfony 也有一个 db 迁移过程,因为 LDAP 模式是相当静态的,但当我编写 LDAP ORM 时,我硬编码了 Django 迁移需要即时处理的部分内容。其余的由模型类中的 PHP 注释处理,类似于 Django 如何具有 pythonic 字段类型并将它们与 LDAP 属性类型相关联。现在我对这一切有了更深入的了解,我对 Django 如何进行 ORM 设置有了更深入的了解。

我希望这对其他转向 Python 和 Django 的 LDAP 开发人员具有指导意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2021-07-30
    • 1970-01-01
    • 2016-09-15
    • 2020-07-22
    • 2012-02-14
    • 2011-06-08
    • 2015-02-03
    相关资源
    最近更新 更多