Loading

Django自带认证系统邮件模板自定义

这几天部署Docker设置Nginx遇到了邮件发送问题
首先我的问题就是,在服务器上部署Docker之后
然后宿主机的Nginx设置代理

server
{
      listen 80;
      server_name cumt.studio www.cumt.studio;
      location / {
        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8003;
      }
}

proxy_pass监听了Docker内网端口
然后代码使用了Django自带的认证系统
以及封装好的Django-registration-redux注册模块
使用上面的Nginx接收的邮件里只有example.com

error

然后找到了一个解决办法
需要设置proxy_host,将host代理为你的域名

好吧.....我太菜
不是很懂Nginx配置,搜了好久,搞了好久
也问了一些人,我放弃了...........
(或许以后某一天就懂了....orzzz)

怎么办??

然后想到flask中模板可以自定义
讲道理这个Django应该也是可以的吧
然后又是一顿乱搜....
最后还是回归到了官方文档

关于Django自带的认证系统
文档(看的翻译版本)这样写的
以重置密码为例

password_reset(
	request,
	template_name='registration/password_reset_form.html',
	email_template_name='registration/password_reset_email.html',
	subject_template_name='registration/password_reset_subject.txt',
	password_reset_form=PasswordResetForm,
	token_generator=default_token_generator,
	post_reset_redirect=None,
	from_email=None,
	current_app=None,
	extra_context=None,
	html_email_template_name=None,
	extra_email_context=None
)

允许用户通过生成一次性使用链接来重置密码
并将该链接发送到用户的注册电子邮件地址

如果系统中不存在提供的电子邮件地址
此视图将不会发送电子邮件,但用户也不会收到任何错误消息
这防止信息泄露给潜在的攻击者,如果在这种情况下要提供错误消息
可以将 PasswordResetForm 子类化并使用 password_reset_form 参数

用户被标记为不可用的密码(请参阅 set_unusable_password() 不允许请求重置密码以防止在使用LDAP等外部认证源时发生误操作)
注意,他们不会收到任何错误消息,因为这将暴露其帐户的存在,但没有邮件也将被发送

可选参数:

  • template_name:用于显示密码重置表单的模板的全名如果未提供,则默认为 registration/password_reset_form.html

  • email_template_name:用于使用重置密码链接生成电子邮件的模板的全名如果未提供,则默认为 registration/password_reset_email.html

  • subject_template_name:用于具有重置密码链接的电子邮件主题的模板的全名如果未提供,则默认为 registration/password_reset_subject.txt

  • password_reset_form:用于获取用户重置密码的电子邮件的表单默认为 PasswordResetForm

  • token_generator:类的实例检查一次性链接这将默认为 default_token_generator,它是 django.contrib.auth.tokens.PasswordResetTokenGenerator 的实例

  • post_reset_redirect:成功重置密码后重定向到的网址

  • from_email:有效的电子邮件地址默认情况下,Django使用 DEFAULT_FROM_EMAIL

  • html_email_template_name:用于生成带有密码重置链接的 text/html 分段电子邮件的模板的全名默认情况下,不发送HTML电子邮件

  • extra_email_context:电子邮件模板中将提供的上下文数据字典

模板上下文:

  • form:用于重置用户密码的表单(请参阅上面的 password_reset_form)

电子邮件模板上下文:

  • email:user.email 的别名

  • user:当前 User,根据 email 表单字段只有活动用户才能重置其密码(User.is_active is True)

  • site_name:site.name 的别名如果你没有安装网站框架,这将被设置为 request.META['SERVER_NAME'] 的值有关网站的更多信息,请参见 “网站”框架

  • domain:site.domain 的别名如果你没有安装网站框架,这将被设置为 request.get_host() 的值

  • protocol:http或https

  • uid:用base64编码的用户主键

  • token:用于检查复位链接是否有效的令牌

示例 registration/password_reset_email.html(电子邮件正文模板):

Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

很明显了,直接添加下面的文件到registration/password_reset_email.html

你收到这封邮件是因为你请求重置平台的账户密码

如果这个用户名是属于您的话: {{ email }}

请访问该页面并选择一个新密码:

{{ protocol}}://自己的域名{% url 'password_reset_confirm' uidb64=uid token=token %}

{{ request.META }}

否则,请忽略这封邮件!

感谢使用我们的站点!

翔工作室技术组

现在就是说site_name和domain是默认链接里的网址
我把域名写死,就发不错了..............
(这里可以获取 request.META.HTTP_HOST 获取网址,但是重置密码的邮件还是获取不到,我就还是写死了./.)

orz

同理,在注册页面的django-registration-redux官方文档处
没找到..........默认模板的命名方式
然后,我就在万能的github搜了一下,activation_email.html(忘了怎么想到是搜这个词的了)
就是这个命名,仿照上面的格式在registration新建就行了

如果要更改邮件标题
可以同一目录添加activation_email_subject.txt和password_reset_subject.txt

虽然是个很笨的方法,但是几天的问题解决了


2018/4/18更新

这个项目在Djanago自带后台有站点设置,修改之后可以正常显示邮件中{{ domain }}信息
不过如果想要自定义邮件模板还是要如上文一样新建html

链接:
Django认证系统视图
Django-registration-redux文档

posted @ 2018-02-01 23:42  bay1  阅读(440)  评论(0编辑  收藏  举报