让Django的身份验证跟踪电子邮件,如何将用户名字段与电子邮件相关联?

4

我的最初想法是在创建账户时将电子邮件地址放入用户名和电子邮件字段中,但这不起作用,因为Django将用户名字段限制为30个字符,这可能不足以容纳电子邮件地址。

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

我的第三个想法是从md5哈希的末尾截取最后两个字符,使其变为30个字符,然后像计划中使用完整哈希值那样使用它。但我不知道以30个字符为界的两个哈希值相同且仅在31和32处不同的机会有多大,我已经将它们砍掉了。

有没有更好的方法来关联用户名字段和电子邮件地址的内容,以确保其始终唯一?


为什么你希望它与电子邮件字段完全相同?为什么不能只是一些随机字符串就可以? - Irfan
1个回答

4

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

为了支持更长的用户名,而不改变Django源代码,我们使用了一个名为longer_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',
    ...
)

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


有时候为了克服这种限制,我们需要做一些有趣的事情——我非常欣赏这个解决方案,它既有创意又不过分俗气。谢谢。 - fish2000
这个方法已经存在很长时间了。也许现在有更好的方法来实现它。 - miku
对于我来说是新的——如果你正在寻找不同的东西,自定义用户对象是可行的,无需猴子补丁或信号滥用:请参见http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/。 - fish2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接