Django应用进阶

一、邮件发送

首先需要再项目的铯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:
        一致的时候 正常相应

猜你喜欢

转载自blog.csdn.net/xianyu_ting/article/details/81104865
今日推荐