Django 如何设计电子邮件和用户名登录

Django 如何设计电子邮件和用户名登录,django,django-forms,Django,Django Forms,我有两个关于用户名和电子邮件的问题 1。如果用户名中有“@”,我判断用户名是一封电子邮件,并按如下方式进行验证: email_user = User.objects.get(email__iexact=username) authenticate(username=email_user.username) 这是你推荐的好方法吗?或者你有更好的建议? 我知道一个AbstractBaseUser可以做到这一点,但我认为使用User更合理 2。我是否应该将用户的电子邮件存储在user.email字段

我有两个关于用户名和电子邮件的问题

1。如果用户名中有“@”,我判断用户名是一封电子邮件,并按如下方式进行验证:

email_user = User.objects.get(email__iexact=username)
authenticate(username=email_user.username)
这是你推荐的好方法吗?或者你有更好的建议? 我知道一个
AbstractBaseUser
可以做到这一点,但我认为使用
User
更合理

2。我是否应该将用户的电子邮件存储在
user.email
字段中?

想象一下,如果我注册了一个新用户:

username: '123'
email: '456@google.com'
当我注册成功后,我发现我的电子邮件是错误的, 现在又有一个用户说,电子邮件是456@google.com“不能再注册了。 我只想确认一封电子邮件是否可以与用户关联。
您的建议是什么?

如果您想使用电子邮件作为唯一的登录密钥,那么如果您使用AbstractBaseUser创建自定义用户模型,将为您将来的网站开发节省大量麻烦。如果你愿意,我可以发布一个示例工作代码

关于第二个问题,您可以在Django()中使用加密签名来生成密钥。进一步将此密钥作为链接发送(例如www.example.com/verify/:some_crypto_key:),并将其作为链接发送到用户的电子邮件地址。此密钥将包含用户id和时间戳。如果您在该链接上收到请求,则表示电子邮件是合法的。您可能会发现一个包可能执行类似的任务

编辑: 实施(捷径)-当用户在您的网站上注册时,立即要求他/她使用您发送到给定电子邮件的链接验证帐户。如果您在给定时间内(比如20分钟)没有收到该电子邮件的回复,请删除该用户条目。这意味着您不能让用户访问您的网站,直到他/她验证帐户


缺陷-考虑用户提交错误电子邮件的情况。很明显,用户将永远无法验证它,但在这20分钟内,如果附带的是,同一封电子邮件的实际用户试图登录您的网站,他将无法访问。这不太可能。此外,该用户还会收到来自您网站的电子邮件,告知用户已注册网站(因此,您可以在此处提供另一个链接,“如果不是您,请单击此处”之类的内容)

除非您迫切希望编写自己的,这将允许您用电子邮件替换用户名字段,我建议使用类似的方法。它包括电子邮件验证(如您问题中所述),并且可以设置为相当容易地将电子邮件用作用户名。这是一个完善的库,有很多支持,比您自己的滚动库更容易使用


(也就是说,自己滚动是一种很有启发性的体验,RA123的要点是,如果你要走这条路,你应该接受这个答案。)

你想为此编写自己的代码吗?或者您只是想要一个具有电子邮件验证功能的登录?类
User
继承自AbstractBaseUser类。您可以创建自己的自定义用户类,该类将覆盖“基本”django用户模型。django auth的用户模型的用户名字段的最大长度为30,因此将其设置为电子邮件字段将永远不起作用,如果您希望将电子邮件作为一个应用程序,则需要创建自己的自定义用户模型username@Withnail您可以在用户名中输入用户名或电子邮件,如果(用户名=用户名和密码=密码)或(电子邮件=用户名和密码=密码)为True,您登录success@Sayse我只想用用户名或电子邮件作为用户名登录。如果我使用电子邮件作为唯一的登录密钥,想象一下,如果我使用123@google.com注册成功,但电子邮件无效123@google.com”“是你的。现在你无法注册自己的帐户,我也无法验证错误的电子邮件<我有点困惑,你能通过任何方式给我一些代码吗?实现这一点还有很长的路要走。然而,让我先告诉你捷径(有一个小缺点),如果这适合你,你可以继续。也许我可以这样做:如果你与123@google.com'和'用户名',现在您只能使用'用户名'登录,除非您验证您的电子邮件。如果其他人使用相同的电子邮件注册并验证成功,您将不会验证该电子邮件(事实上,如果该电子邮件不是您的,您将无法收到任何验证电子邮件),并且应修改另一封电子邮件以绑定。:)当然可以。使用django当前的用户模型,您可以很容易地做到这一点。我解释的所有内容都是针对用户名不存在且电子邮件是登录密钥的情况。非常感谢,我将对此进行详细说明。:)