如何自定义 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)/$
在这种情况下,我可以指定一个域,但 uid
和 token
仍然不起作用...
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
我正在使用 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)/$
在这种情况下,我可以指定一个域,但 uid
和 token
仍然不起作用...
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