【问题标题】:Made Django's auth track on emails, how to relate username field to email?在电子邮件上制作了 Django 的身份验证跟踪,如何将用户名字段与电子邮件相关联?
【发布时间】:2011-03-24 02:12:02
【问题描述】:

虽然我最初只是在创建帐户时将电子邮件地址放入用户名和电子邮件字段中,但这不起作用,因为 Django 将用户名字段限制为 30 个字符,这对于电子邮件地址可能不够。

我的第二个想法是 md5 电子邮件地址,将哈希放入用户名中,这将使其始终是唯一的(从技术上讲,与电子邮件字段相同)。 md5 是 32 个字符,我也只有 30 个字符可以使用。

我的第三个想法是将 md5 散列末尾的最后两个字符切掉,使其变为 30,然后按照我计划将其与完整散列一起使用的方式使用它。但是我不知道最终得到两个哈希值的可能性有多大,这些哈希值在第 30 个字符之前是相同的,并且仅在 31 和 32 处不同,我已经将其砍掉了。

有没有更好的方法将用户名字段的内容与电子邮件地址相关联,使其始终独一无二?

【问题讨论】:

  • 为什么要它与电子邮件字段相同。为什么不只是一些随机字符串会起作用?

标签: python database django authentication


【解决方案1】:

我们开发了一个 django 应用程序,它将电子邮件存储为用户名。 Django 内置用户名模型限制为 30 个字符,这对 90% 来说是好的。

为了支持更长的用户名,在不改变 django 源的情况下,我们使用了一个很小的附加应用程序,称为 long_username:

from django.db.models.signals import class_prepared

def longer_username(sender, *args, **kwargs):
    # You can't just do `if sender == django.contrib.auth.models.User`
    # because you would have to import the model
    # You have to test using __name__ and __module__
    if sender.__name__ == "User" and sender.__module__ == \
        "django.contrib.auth.models":
        sender._meta.get_field("username").max_length = 75

class_prepared.connect(longer_username)

我们将此作为第一个应用程序添加到 INSTALLED_APPS 中:

INSTALLED_APPS = (
    'longer_username',
    ...
)

就是这样。更多信息可以在这里找到:

【讨论】:

  • 要克服这个限制,必须做些什么有点有趣——我非常感谢这个解决方案,它很有创意,又不会太俗气。谢谢。
  • 这个recipe可以追溯到很久以前。也许现在有更好的方法来做到这一点。
  • 无论如何对我来说都是新的——如果你正在寻找不同的东西,自定义用户对象是可行的,没有猴子补丁或信号滥用:见scottbarnham.com/blog/2008/08/21/…
猜你喜欢
  • 2018-09-09
  • 2012-08-10
  • 2020-01-10
  • 2021-09-06
  • 2020-05-11
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多