一、邮件发送
首先需要再项目的铯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=[ 'ergouzi@qq.com' ] #开始发送邮件 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 = [ '0070@qq.com', '68924@qq.com' ] content2="皮一下,超好玩的" #邮件1&2 msg1 = (title, content1, email_from, reciever1) msg2 = ("小哥哥", content2, email_from, ['0070@qq.com','83603@qq.com']) #使用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="../../jquery/3.1.1/jquery.min.js"></script> <script src="../../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:
一致的时候 正常相应