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

Dmi*_*kov 19 email authentication django

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

  1. 最糟糕的一个:用户名字段受max_length=30属性限制,对于电子邮件来说这是非常小的.即使你重写表单验证,DB将有varchar(30)代替EmailFieldvarchar(75),除非你手动改变你的表.
  2. 您需要将用户名和电子邮件字段中的电子邮件数据存储起来才能User.email_user()正常工作.我认为在User.email使用时还有其他一些地方.
  3. 代码可读性失败.当然,其他djangonauts知道这个陷阱,但处理字段称为"用户名"(特别是当仍有电子邮件字段时),因为电子邮件显然使您的代码不易理解.

另一种方法可能是使用email字段进行身份验证,将其传递给您的身份验证后端,但它仍然存在问题:

authenticate(self, email=None, password=None)
Run Code Online (Sandbox Code Playgroud)
  1. User.email没有unique=True属性,这意味着你的数据库不会有索引,使你的电子邮件查找速度变得很慢.
  2. 你必须处理username字段,它unique=True通过从表中完全删除它或改变它以允许NULL并删除索引.

恢复,两种方式都是邪恶的,并且需要在syncdb之后执行特定于DB的代码,如果您需要与DB无关的应用程序,这是不可接受的.

Tom*_*tie 6

我打包了django-email-as-username,如果你想要删除用户名,并且只使用电子邮件,它应该可以满足你所需要的一切.

简要概述是:

  1. 提供用于创建用户的电子邮件身份验证后端和帮助程序功能.
  2. 修补Django管理员以处理基于电子邮件的用户身份验证.
  3. 覆盖createsuperuser命令以仅使用电子邮件创建用户.
  4. 将电子邮件身份验证视为不区分大小写.

在引擎盖下,用户名是电子邮件的哈希版本,最终意味着我们不仅限于Django的用户名30字符限制(只是常规电子邮件75字符限制.)

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


Jim*_*Gaw 5

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

使用Django中的电子邮件地址登录

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