如何自定义 URL 以在电子邮件模板中重置密码?

How to customize a URL to reset password in an email template?

我正在使用 Django Rest Auth 和 Django All Auth。

当我到达一个端点时 /rest-auth/password/reset/ (POST) 我收到一封电子邮件,其中包含 URL 用于重置密码的电子邮件。

但是 URL 不起作用,因为域总是 example.com 并且 uid token 不能正常工作,如下所示...

http://example.com/password/reset/confirm/(%3FPMzQ%5B0-9A-Za-z_%5C-%5D+)/(%3FP5ku-afb8832e99157c02f452%5B0-9A-Za-z%5D%7B1,13%7D-%5B0-9A-Za-z%5D%7B1,20%7D)/$

我已经覆盖了 PasswordResetSerializer 以使用我的电子邮件模板引用

我该如何解决这种情况?


代码如下:

serializers.py

from rest_auth.serializers import PasswordResetSerializer


class CustomPasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self):
        print("check override")

        return {
            'email_template_name': 'password_reset_key_message.txt',

        }

password_reset_key_message.txt

A password reset has been requested.
Click the link below to continue.

{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

如果我将 {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} 的一部分更改为 {{ password_reset_url }} 电子邮件不包含任何 URL


当我像 berow 一样在 def get_email_options(self) 中添加 'domain_override' 时,

from rest_auth.serializers import PasswordResetSerializer


class CustomPasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self):
        print("check override")

        return {
            'domain_override': 'localhost:8000',
            'email_template_name': 'password_reset_key_message.txt',

        }

URL变成了下面这样,

http://localhost:8000/password/reset/confirm/(%3FPMzQ%5B0-9A-Za-z_%5C-%5D+)/(%3FP5ku-afb8832e99157c02f452%5B0-9A-Za-z%5D%7B1,13%7D-%5B0-9A-Za-z%5D%7B1,20%7D)/$

在这种情况下,我可以指定一个域,但 uidtoken 仍然不起作用...


python: 3.7.5

Django:2.2.2

django-allauth:0.41.0

django-rest-auth:0.9.5

djangorestframework:3.12.1

如果您打算将 example.com 更改为另一个域,则需要更改数据库中的域。为此,通过 python manage.py createsuperuser 创建一个超级用户,然后转到 /admin 页面。然后单击站点选项上的更改按钮。然后您将看到 'example.com' 只需单击它并将其更改为您期望的域。是的,您不需要您指定的如此关键的方式。

更新

对提问者有效的实际答案是做上面提到的事情,并将 path('accounts_api/password/reset/confirm/(..... 替换为 re_path(r'^accounts_api/password/reset/confirm/(..... 在 urls.py