在Django中以用户名发送电子邮件

时间:2010-08-23 11:20:16

标签: django email authentication

好的,对于每个使用Django且经常被新手询问的人来说,这个很明显,但是我想说清楚并讨论是否有其他方法可以做到这一点。现在最流行和最方便的方法是在用户名字段中存储电子邮件,因为Django 1.2允许使用“@”,“_”和“ - ”字符,但这种方式存在以下问题:

  1. 最糟糕的一个:用户名字段受max_length=30属性限制,这对于电子邮件来说非常小。即使您覆盖表单验证,除非您手动更改表格,否则数据库将包含varchar(30)而不是EmailField的{​​{1}}。
  2. 您需要将您的电子邮件数据存储在用户名和电子邮件字段中,以使varchar(75)正常工作。我认为在使用User.email_user()时还有其他一些地方。
  3. 代码可读性失败。当然,其他djangonauts知道这个陷阱,但处理字段称为“用户名”(特别是当仍有电子邮件字段时),因为电子邮件显然会使您的代码不易理解。
  4. 另一种方法可能是使用User.email字段进行身份验证,方法是将其传递给您的身份验证后端,但仍然存在问题:

    email
    1. authenticate(self, email=None, password=None) 没有User.email属性,这意味着您的数据库没有索引,使您的电子邮件查找速度变得很慢。
    2. 您必须处理unique=True字段,该字段具有username,方法是将其从表中完全删除或将其更改为允许NULL并删除索引。
    3. 恢复,两种方式都是邪恶的,需要在syncdb之后执行特定于DB的代码,如果您需要独立于数据库的应用程序,这是不可接受的。

3 个答案:

答案 0 :(得分:6)

我打包了django-email-as-username,如果您要删除用户名,并且只使用电子邮件,那么它几乎可以完成所需的一切。

简要概述是:

  1. 提供用于创建用户的电子邮件身份验证后端和帮助程序功能。
  2. 修补Django管理员以处理基于电子邮件的用户身份验证。
  3. 覆盖createsuperuser命令以仅使用电子邮件创建用户。
  4. 将电子邮件身份验证视为不区分大小写。
  5. 在引擎盖下,用户名是电子邮件的哈希版本,最终意味着我们不仅限于Django的用户名30字符限制(只是常规电子邮件75字符限制。)

    编辑:从Django 1.5开始,您应该考虑使用自定义用户模型而不是'django-email-as-username'包。

答案 1 :(得分:5)

大卫克莱默想出了一个我喜欢的问题的解决方案。我目前在生产网站上使用它,用户必须能够使用他们的电子邮件或用户名登录。你可以在这里找到它:

Logging In With Email Addresses in Django

如果表单上提供的登录名是电子邮件(包含“@”符号),它将尝试对其进行身份验证,如果不是电子邮件,则会返回用户名。 (当然,您只需要确保您的注册表格能够收集这项工作的电子邮件。)

答案 2 :(得分:0)

好吧,我没有必要在Django中使用电子邮件作为用户名,但我猜你可以创建一个UserProfile模型并将字段聚合到它,就像另一个电子邮件字段一样,并使其独一无二。因此,您可以使用user.get_profile()。email进行身份验证。

我想其他方法是继承User并重新定义字段,但我认为这仍然不是Django开发人员推荐的。

最后,您可以定义自己的自定义用户模型,然后返回django.contrib.auth.models.User以获取某些逻辑。

改变Django中用户表的代码:

 from django.db import connection
 cursor = connection.cursor()
 cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL")
相关问题