Django | 从中间件的角度来认识Django发送邮件功能

文章目录

概要

  • 摘要
    业务告警 邮件验证 密码找回

  • 邮件告警

中间件

中间件 ---> '钩子'

例如 访问路由 的次数【请求】

  • 中间件类须实现下列五个方法中的一个或多个:
python 复制代码
#请求过滤   拦截 到达 路由前
1.process_request(self,request) 
执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象

# 通过路由后  到达视图前    拦截  可以更换视图的参数
2.process_view(self,request,callback,callback_args,callback_kwargs)
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象

# 返回浏览器之前
3. process_response(self,request,response)
所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象

# 出现异常
4.process_exception(self,request,exception)
当处理过程中抛出异常时调用,返回一个HttpResponse对象

# 不常用
5.process_template_response(self,request,response)
在视图函数执行完毕且试图返回的对象中包含render,方法时被
调用;该方法需要返回实现了render.方法的响应对象

实现中间件

注意:配置为数组,中间件被调用时以先上到下由下到上的顺序调用

  • 项目目录下创建middleware文件夹 自定义py文件写类

    中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponese对象时表示此请求结束【就是出现问题了】,直接返回给客户端

demo

  • 案例
  1. 创建 文件夹middleware
  2. 创建mymiddleware.py文件
  3. 创建类VisitLimit
python 复制代码
class VisitLimit(MiddlewareMixin):

    visit_times = {}

    def process_request(self,request):

        ip_adress = request.META['REMOTE_ADDR']
        path_url = request.path_info
        print('path :',path_url)


        if not re.match('^/test',path_url): # 正则表达式匹配 /test  开头的网址
            return

        # 计数  每个都要计算   最好是内存数据库  例如redis  后面学
        times = self.visit_times.get(ip_adress,0) # 没有 设置0
        print('ip',ip_adress,'已经访问',times)
        self.visit_times[ip_adress] = times + 1
        if times < 5:
            return
        return HttpResponse('您已经访问过'+str(times)+'次,访问被禁止')

        # 若要是从新测试 需要 crtl + c 关掉服务 重新 python manage.py runserver  释放类变量
  1. settingspy注册中间件

邮件发送过程

  • SMTP 简单邮件传输协议 25 端口 推送协议
  • IMAP 交互式邮件访问协议 143端口 拉取协议
  • 邮件相关协议 POP3 110 端口 拉取协议

更多详情 : SMTP/IMAP服务

一个动作 一个协议

django在这里充当客户端的功能

Django如何做

邮件服务配置流程
  1. 申请QQ号
  2. 用QQ号登陆QQ邮箱并修改设置
    • 用申请到的QQ号和密码登陆到https://mail.qq.com/
    • 修改QQ邮箱->设置->帐户->"POP3/IMAP....服务"
  • settings.py配置
  • 函数调用

中间件结合邮件服务实现告警

  • 要求

  • settings.py配置 邮件所需服务

  • mymiddleware.py 创建类和相应的类处理方法 【追溯错误代码行 发送邮件给出错误

python 复制代码
class ExceptionMW(MiddlewareMixin):

    def process_exception(self,request,exception):

        print(exception)  # 这是错误 : name 'a' is not defined
        print(traceback.format_exc())  # 追溯出问题的代码所在位置

        mail.send_mail(subject='project error',message=traceback.format_exc(),from_email=settings.EMAIL_HOST_USER,recipient_list=settings.EX_EMAIL)
		# EMAIL_HOST_USER   from_email='xxx@qq.com'也可以   作用相同 

        return HttpResponse('--- 对不起  当前网页有点忙  ')
  • views.py中写一个错误 来让中间件类中的方法捕获
python 复制代码
def test_upload(request):
    if request.method == 'GET':
        a  # 自定义一个错误让中间件进行捕获
        return render(request,'test_upload.html')
    elif request.method == 'POST':
        title = request.POST['title']
        myfile = request.FILES['myfile']

        Content.objects.create(title=title,picture=myfile)
        return  HttpResponse('上传文件成功!')
相关推荐
problc3 小时前
零拷贝技术在现代编程语言和中间件中的应用
中间件
傻傻虎虎3 小时前
【系统架构设计】基于中间件的开发
中间件·系统架构
计算机学姐8 小时前
基于python+django+vue的二手电子设备交易平台
开发语言·vue.js·后端·python·mysql·django·web3.py
老K(郭云开)13 小时前
汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用
前端·chrome·中间件·edge·创业创新·html5
Thuni_soft15 小时前
华宇TAS应用中间件斩获2024鲲鹏应用创新大赛北京赛区总决赛二等奖!
中间件
计算机学姐16 小时前
基于python+django+vue的学生管理系统
开发语言·vue.js·后端·python·mysql·django·web3.py
cuisidong199717 小时前
django 通过地址访问本地文件
python·django·sqlite
计算机学姐18 小时前
基于python+django+vue的外卖管理系统
开发语言·vue.js·后端·python·mysql·django
计算机学姐19 小时前
基于python+django+vue的宠物服务管理系统
开发语言·vue.js·后端·python·django·web3.py·宠物
不染_是非21 小时前
Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)
数据库·后端·学习·django·web