Django中管理员创建新用户时如何自动发送密码重置邮件?
Django实现新建用户后自动发送密码重置邮件方案
1. 前提配置:邮件服务参数
首先需要在项目settings.py中配置正确的SMTP邮件发送参数,示例如下:
# settings.py 邮件配置示例 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = '你的SMTP服务器地址' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '发件人邮箱地址' EMAIL_HOST_PASSWORD = '发件人邮箱授权码' DEFAULT_FROM_EMAIL = '站点管理员 <发件人邮箱地址>'
本地测试时可以临时把EMAIL_BACKEND改为django.core.mail.backends.console.EmailBackend,邮件会直接输出在控制台方便调试。
2. 视图代码修改
首先在视图文件头部导入依赖工具:
from django.contrib.auth.tokens import default_token_generator from django.contrib.sites.shortcuts import get_current_site from django.core.mail import send_mail from django.template.loader import render_to_string from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes from django.urls import reverse
然后修改newmember视图逻辑,在用户和关联Member模型保存成功后新增密码重置邮件发送逻辑:
def newmember(request): if request.method == 'POST': nu_form = NewUser(request.POST) nm_form = NewMember(request.POST) if nu_form.is_valid() and nm_form.is_valid(): # 先暂存用户对象,设置无效密码避免无密码可登录的安全问题 nusave = nu_form.save(commit=False) nusave.set_unusable_password() nusave.save() nmsave = nm_form.save(commit = False) nmsave.user = nusave nmsave.save() # ------ 新增密码重置邮件发送逻辑 ------ current_site = get_current_site(request) # 生成密码重置链接的校验参数 uidb64 = urlsafe_base64_encode(force_bytes(nusave.pk)) token = default_token_generator.make_token(nusave) # 拼接完整的重置链接 reset_url = request.build_absolute_uri( reverse('password_reset_confirm', kwargs={'uidb64': uidb64, 'token': token}) ) # 构造邮件内容 mail_subject = '你的站点账户已创建,请设置登录密码' mail_content = render_to_string('email/password_reset_invite.html', { 'user': nusave, 'reset_url': reset_url, 'site_name': current_site.name, }) # 发送邮件 send_mail( subject=mail_subject, message=mail_content, from_email=None, recipient_list=[nusave.email], fail_silently=False, ) return redirect(members) else: print(nu_form.errors) print(nm_form.errors) else: nu_form = NewUser() nm_form = NewMember() context = { 'nu_form': nu_form, 'nm_form': nm_form } return render(request, 'web/newmember.html', context)
3. 补充说明
- 需要自行创建邮件模板
templates/email/password_reset_invite.html,可按照业务需求自定义内容,示例如下:
你好 {{ user.username }}: 管理员已为你在{{ site_name }}创建了账户,请点击以下链接设置你的登录密码: {{ reset_url }} 如果链接无法点击,请复制到浏览器地址栏访问,链接24小时内有效。
- 确保项目路由中已经配置了Django自带的认证路由,只要包含
path('accounts/', include('django.contrib.auth.urls'))就可以正常使用password_reset_confirm视图。 - 如果需要避免邮件发送阻塞请求,可以使用Celery等异步任务工具把邮件发送逻辑改为异步执行。
内容的提问来源于stack exchange,提问作者overclock
相关产品推荐
相关产品推荐

