有没有自定义的Django电子邮件确认链接模块?

3 投票
1 回答
1120 浏览
提问于 2025-04-18 07:44

我正在搭建一个网站,用户可以在上面报名参加狗狗训练课程。客户希望能够通过一个邮件确认链接,自动将当前班级的学员注册到即将开班的课程中。

我希望用户在操作时不需要登录网站。因此,所有相关的信息都需要包含在生成的链接中。这个链接最好能经过某种方式的加密,这样随机的机器人请求就不会搞乱系统。

有没有现成的应用或方法可以用来实现这个功能呢?

1 个回答

3

当你在后台创建并发送邮件时,可以为用户生成一个带时间戳的令牌(其实就是用户状态的一个哈希值)。把这个令牌和用户的UID编码到网址里,然后在用户点击链接时,在注册页面检查它的有效性。通过对用户状态进行哈希处理,可以确保(在实际操作中)你不会遇到机器人随机生成正确网址的问题。

contrib.auth 中,内置的密码重置视图基本上就是这样做的。发送给用户的重置邮件中的网址最后有两个参数——一个是经过 base-64 编码的 UID,另一个是生成的令牌。令牌生成的源代码在这里:https://github.com/django/django/blob/master/django/contrib/auth/tokens.py,相关的视图是 password_reset_confirm,可以在这里找到:https://github.com/django/django/blob/master/django/contrib/auth/views.py

你也可以为你的应用实现类似的功能,但在生成令牌时要小心。在 contrib.auth 的令牌生成器中,他们会对用户的整个内部状态进行哈希,包括密码的哈希值,这样可以确保链接只在一次有效,因为用户重置密码后,密码的哈希值会改变。如果你想确保链接只有效一次,就必须在哈希中包含一些其他会改变的状态。

撰写回答