You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置dj-rest-auth在密码重置邮件中发送自定义React前端URL并使用自定义邮件模板?

如何配置dj-rest-auth在密码重置邮件中发送自定义React前端URL并使用自定义邮件模板?

我来帮你梳理下问题,你现在的核心需求是让密码重置邮件里的链接指向React前端而非Django API,咱们一步步排查并修正配置:

1. 先确认基础配置的准确性

首先确保.env文件里的BASE_URL是正确的前端域名,比如https://my-domain.com,然后在settings.py里正确加载并配置REST_AUTH:

# settings.py
from dotenv import load_dotenv
import os

# 先加载.env文件的环境变量
load_dotenv()

REST_AUTH = {
    # 注意这里的{uidb64}和{token}要保留大括号,后续会被自动替换为实际值
    'PASSWORD_RESET_CONFIRM_URL': f"{os.getenv('BASE_URL').rstrip('/')}/password-reset/confirm/{{uidb64}}/{{token}}",
    'PASSWORD_RESET_SERIALIZER': 'users.serializers.CustomPasswordResetSerializer',
}

# 还要确保TEMPLATES配置包含模板所在目录
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 模板放在项目根目录的templates下
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2. 修正自定义序列化器的逻辑

你的CustomPasswordResetSerializer不需要手动传递password_reset_url到模板,dj-rest-auth会自动处理PASSWORD_RESET_CONFIRM_URL的变量替换,优化后的序列化器如下:

# serializers.py
from dj_rest_auth.serializers import DjRestAuthPasswordResetSerializer
from django.conf import settings

class CustomPasswordResetSerializer(DjRestAuthPasswordResetSerializer):
    def get_email_options(self):
        return {
            # 指定自定义邮件模板路径
            'email_template_name': 'registration/password_reset_email.html',
            # 可选:如果需要在模板里直接用BASE_URL,就传递这个变量
            'extra_email_context': {
                'base_url': settings.REST_AUTH['PASSWORD_RESET_CONFIRM_URL'].split('/password-reset')[0]
            }
        }

3. 修复密码重置邮件模板

你之前的模板尝试了两种写法但没生效,现在给你两种可靠的写法:

写法一:直接用配置好的PASSWORD_RESET_CONFIRM_URL(推荐)

dj-rest-auth会自动把PASSWORD_RESET_CONFIRM_URL里的{uidb64}和{token}替换为实际值,模板里直接引用即可:

<!-- templates/registration/password_reset_email.html -->
<p>你好,</p>
<p>请点击下面的链接重置你的密码:</p>
<a href="{{ password_reset_url }}">
    {{ password_reset_url }}
</a>
<p>如果链接无法点击,请复制下面的地址到浏览器打开:</p>
<p>{{ password_reset_url }}</p>

写法二:手动用变量拼接URL

如果想在模板里灵活拼接,就用传递的base_url、uid(已编码为uidb64格式)和token变量:

<!-- templates/registration/password_reset_email.html -->
<p>你好,</p>
<p>请点击下面的链接重置你的密码:</p>
<a href="{{ base_url }}/password-reset/confirm/{{ uid }}/{{ token }}">
    {{ base_url }}/password-reset/confirm/{{ uid }}/{{ token }}
</a>

4. 修正URL配置的语法错误

你的urls.py里的路径参数写法有误,把&lt;uidb64&gt;/&lt;token&gt;/改成<uidb64>/<token>/:

# urls.py
from django.urls import path
from dj_rest_auth.views import LogoutView, PasswordResetConfirmView
from .views import CustomPasswordResetView

urlpatterns = [
    path('password/reset/', CustomPasswordResetView.as_view(), name='rest_password_reset'),
    # 修正为正确的路径参数写法
    path('password/reset/confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    # 其他URL配置...
]

注:这个API地址是给Django后端用的,用来验证重置链接的有效性,邮件里的链接指向React前端后,前端需要在用户点击后调用这个API来完成密码重置流程。

5. 视图层保持简洁即可

你的CustomPasswordResetView配置是正确的,不需要额外修改:

# views.py
from dj_rest_auth.views import PasswordResetView
from .serializers import CustomPasswordResetSerializer

class CustomPasswordResetView(PasswordResetView):
    serializer_class = CustomPasswordResetSerializer

最后测试验证

用Postman或curl发送POST请求到/api/auth/password/reset/,参数带上email(比如{"email": "test@example.com"}),然后查看收到的邮件,确认链接是指向React前端的域名。

如果还是有问题,可以先检查:

  • .env文件的BASE_URL是否被正确加载(可以在Django shell里输入os.getenv('BASE_URL')验证)
  • 模板文件是否放在正确的路径下(templates/registration/)
  • 邮件是否被正确发送到邮箱(可以检查Django的邮件日志,或者用console邮件后端测试:settings.py里配置EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend',这样邮件内容会打印到控制台)

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:23:08