我们之前讨论过Django REST框架和dj-rest-auth,这两个都是Django的有效库,你可以轻松创建rest APIs并处理用户认证。
在这篇文章中,我们将特别关注dj-rest-auth和它内置的重置密码功能。如果用户想重置密码,他们必须提交重置密码请求,并收到一封带有重置页面链接的邮件。
这个功能是由dj-rest-auth库提供的,但发送给其用户的邮件是纯文本的,而其中的链接则是来自内置的dj-rest-auth端点。在某些情况下,这可能正是你想要的,但它并不总是很合适。
如果你想改变这个电子邮件的内容,这个过程有很好的记录,但只有当你想把它改成纯文本文件时。如果你想改成一个自定义的HTML模板,这方面的信息并不多。
设置
在这个例子中,我们将假设你已经安装了python、Django、Django REST框架和dj-rest-auth的项目,准备进行这些改动。在我的例子中,我做了一个非常简单的项目,只有一个叫做API的应用,以及以下的布局:

正如你在上面看到的,我有一个模板文件夹,其中我做了一个新的文件夹叫 注册的文件夹,里面有一个叫 custom_reset_confirm.html内。
HTML电子邮件模板中的上下文看起来像这样:

你可能已经注意到了,内容与默认邮件中的内容基本相同,为了简单起见,我没有添加很多样式,只是添加了一些粗体和斜体的文字,以及一个字体较大的问候语。
相关的变量如 site_name, domain,之类的,将被自动分配给模板的上下文中传递的值。
改变默认的电子邮件
现在我们有了我们的模板,接下来我们需要做的是表明这就是我们想在用户请求重置密码时发送的内容。
要做到这一点,我们必须定义一个继承自dj-rest-auth的串行器 密码重置序列化器并覆盖其 get_email_options方法,然后使用该序列化器而不是默认的。
所以,首先,我们将定义新的序列化器:


然后在我们的 ***settings.py。***中指出这是我们要使用的序列化器:

现在,如果你发送一个重置密码的请求,你应该收到类似这样的信息:
在我的例子中,因为我在本地运行这个项目,它使用了 localhost:8000 为 site_name.
现在,假设你想在这封邮件中添加一些其他的东西,一些可能会改变的信息,你将无法在模板本身硬编码。
让我们来看看添加社交媒体的链接,在这种情况下,我可以把关键的 extra_email_context 添加到字典中,该字典 get_email_options返回,而作为其值的是一个带有额外上下文的字典。
例如,让我们把 {{site_name}}团队 在结尾处用一个假的URL:

而现在在序列化器中定义social_media_url的值:

也可以用同样的方法覆盖默认值,如 site_name的默认值。 ***extra_email_context。***来覆盖默认值,但不建议这样做。
最后,这里有一些代码,用来制作一个简单但更漂亮的模板,这样你就能体会到你的邮件在视觉上会有多大的吸引力:



现在,这就是它的样子了:
结论
在这篇博文中,你学到了如何在dj-rest-auth中覆盖任何电子邮件模板。虽然我们专注于重置密码的功能,但同样的原则也可以用在其他情况下。
我们通过定义一个自定义的PasswordResetSerializer,用一个新的HTML邮件来替换重置密码的邮件。我们还通过动态地使用PasswordResetSerializer基类的get_email_options 方法来更新邮件内容。
我希望你喜欢这篇最新的文章,并认为它很有用。谢谢你的阅读,请继续关注更多类似的内容。