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
然后找到了一个解决办法
需要设置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 获取网址,但是重置密码的邮件还是获取不到,我就还是写死了./.)
同理,在注册页面的django-registration-redux官方文档处
没找到..........默认模板的命名方式
然后,我就在万能的github搜了一下,activation_email.html(忘了怎么想到是搜这个词的了)
就是这个命名,仿照上面的格式在registration新建就行了
如果要更改邮件标题
可以同一目录添加activation_email_subject.txt和password_reset_subject.txt
虽然是个很笨的方法,但是几天的问题解决了
这个项目在Djanago自带后台有站点设置,修改之后可以正常显示邮件中{{ domain }}信息
不过如果想要自定义邮件模板还是要如上文一样新建html