一、邮件发送
首先需要再项目的铯ttings.py文件中,添加以下文件:
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = environ.get("EMAIL_SENDER") # 帐号
EMAIL_HOST_PASSWORD = environ.get("EMAIL_PWD") # 授权码(****)
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
其中,用户名和密码也可以写出来,账号是自己的邮箱,授权码需要打开邮箱的smtp服务,登陆相关网站进行开启就可以啦~
其次,我们需要在views.py 中来进行调用和定义发生送的邮件。
from django.core.mail impport send_mail
def send_my_email(req):
title="恭喜发财"
msg="咸鱼婷她真的只是一条咸鱼"
email_from=settings.DEFAULT_FROM_EMAIL
reciver=[
'[email protected]'
]
#开始发送邮件
send_email(titile,msg,email_from,reciver)
return HttpResponse("666")
这样就可以发送,也可以定义一个发送页面:
def send_my_email_v1(req):
title="....."
msg="此处为空"
email_from="....."
reciver=[
'接收者邮箱地址'
]
#加载模板
template=loader.get_template("email.html")
#渲染模板
html_str=template.render({'msg'}:'吼吼吼')
#发送
send_email=(title,msg,email_from,reciver,html_message=html_str)
return HttpResponse("7777")
进阶:邮箱验证码的实现
步骤:1-生成随机字符串
2-拼接激活链接url
3-把随机字符串和发送的邮箱保存到缓存(需要添加缓存的配置,上一节有讲)
4-创建激活页面
5-将激活页面发送给对应的账号
6-写验证链接对应的API在里面完成验证。
def verify(req):
if req.method=="GET":
return render(req,'verify.html')
else:
params=req.POST
email=params.get('email')
#生成随机字符
random_str=get_random_str()
#验证拼接链接
url=""自己的服务器+端口号/t8/active/" + random_str"
#加载激活模板
tem=loader.get_template('activate.html')
#渲染模板
html_str=tem.render({'url':url})
#准备发送的数据,发送邮件,格式同上
...
...
send_mail(title, msg, email_from, reciever, html_message=html_str)
#记录token 对应的邮箱是谁
cache.set(random_str,email,120)
return HttpResponse("ok")
#激活API
def active(req,random_str):
res=cache.get(random_str)
if res:
return HttpResponse(res+"激活成功")
else:
return HttpResponse("验证连接无效")
三、一次发送多封邮件
需要利用:send_mail VS send_mass_mail
send_mail:没法送一封邮件,就要和SMTP做一次链接
send_mass_mail:可以一次连接大宋多封Email。
完整代码如下:
def send_many_email(req):
title = "加油"
content1 = "恭喜帅磊磊喜提高铁一辆"
email_from = settings.DEFAULT_FROM_EMAIL
reciever1 = [
'[email protected]',
'[email protected]'
]
content2="皮一下,超好玩的"
#邮件1&2
msg1 = (title, content1, email_from, reciever1)
msg2 = ("小哥哥", content2, email_from,
['[email protected]','[email protected]'])
#使用send_mass_mail
send_mass_mail((msg1, msg2), fail_silently=True)
return HttpResponse("ok 666")
四、CSRF(CROSS SITE REQUEST FORKEY)跨站请求伪造
攻击流程(用户A访问可信站点1时,浏览器会保存网站的cookie,当用户A访问不可信站点2时,如果站点2有指向站点1的链接的时候 ,攻击就有可能发生
原理:当浏览器第一次和django服务做就交互的时候,django服务会在浏览器的cookie里加入csrdtoken.
举例:
1- 包含站点1的链接,点击跳转。
2-img的src属性值是站点一的链接.
3-js加载,js里面有跳转的动作。
DJANGO解决办法:
预防被csrf攻击的方法就是在用户的提交表单中加一个csrf的隐含值,这个值和服务器中保存的cerftoken相同。
前后端的使用:
后端:
全局使用(禁用):将settings.py里的csrf中间件注释掉
局部使用或禁用
from django.views.decorators.csrf import csrf_exempt(不使用CSRF验证),
csrf_protect(使用CSRF校验)
前端:
Form表单({%csrf_token%} )
Ajax方式(var csrf = $.cookie("csrftoken"); 拿cookie里面的值 )
x <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script src="//cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
var csrf = $.cookie("csrftoken");
function commit() {
var csrf = $.cookie("csrftoken");
console.log(csrf);
var u_name = $("#u_name").val();
var num = $("#num").val();
$.ajax({ url:"/t8/csrf",
method:"post",
data:{ "u_name": u_name,
"num": num, 'csrfmiddlewaretoken': csrf },
success:function (data) {
alert(data);
} }) }
quesstion:Django是如何实现防止攻击的?
answer:1-当浏览器和服务器做交互的时候,服务器会生成一个随机的token,然后把这个字符串保存到浏览器的co
cookie里,同时在页面中添加隐藏的input 标签,值就是csrf_token.
2-以后在和服务器做post请求的时候,前端页面要带着csrf_token
3-服务器就会去校验前端传过来的csrf_token,是不是一致,
if 不一致:
return 403 禁止访问
else:
一致的时候 正常相应