文章目录
- 概要
- 中间件
- 中间件 ---> '钩子'
- 实现中间件
- demo
- 邮件发送过程
- Django如何做
- 邮件服务配置流程
- 中间件结合邮件服务实现告警
概要
-
摘要
业务告警 邮件验证 密码找回
-
邮件告警
中间件
中间件 —> ‘钩子’
例如 访问路由 的次数【请求】
- 中间件类须实现下列五个方法中的一个或多个:
#请求过滤 拦截 到达 路由前
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.方法的响应对象
实现中间件
- settings.py
注意:配置为数组,中间件被调用时以
先上到下
再由下到上
的顺序调用
- 项目目录下创建middleware文件夹 自定义py文件写类
中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponese对象时表示此请求结束【就是出现问题了】,直接返回给客户端
demo
- 案例
- 创建 文件夹middleware
- 创建mymiddleware.py文件
- 创建类VisitLimit
class VisitLimit(MiddlewareMixin):visit_times = {}def process_request(self,request):ip_adress = request.META['REMOTE_ADDR']path_url = request.path_infoprint('path :',path_url)if not re.match('^/test',path_url): # 正则表达式匹配 /test 开头的网址return# 计数 每个都要计算 最好是内存数据库 例如redis 后面学times = self.visit_times.get(ip_adress,0) # 没有 设置0print('ip',ip_adress,'已经访问',times)self.visit_times[ip_adress] = times + 1if times < 5:returnreturn HttpResponse('您已经访问过'+str(times)+'次,访问被禁止')# 若要是从新测试 需要 crtl + c 关掉服务 重新 python manage.py runserver 释放类变量
- settingspy注册中间件
邮件发送过程
- SMTP 简单邮件传输协议 25 端口
推送
协议 - IMAP 交互式邮件访问协议 143端口
拉取
协议 - 邮件相关协议 POP3 110 端口
拉取
协议
更多详情 : SMTP/IMAP服务
一个动作 一个协议
django在这里充当客户端的功能
Django如何做
邮件服务配置流程
- 申请QQ号
- 用QQ号登陆QQ邮箱并修改设置
- 用申请到的QQ号和密码登陆到https://mail.qq.com/
- 修改QQ邮箱->设置->帐户->“POP3/IMAP.…服务”
- settings.py配置
- 函数调用
中间件结合邮件服务实现告警
-
要求
-
settings.py配置 邮件所需服务
-
mymiddleware.py 创建类和相应的类处理方法 【
追溯错误代码行
发送邮件给出错误
】
class ExceptionMW(MiddlewareMixin):def process_exception(self,request,exception):print(exception) # 这是错误 : name 'a' is not definedprint(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中写一个错误 来让中间件类中的方法捕获
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('上传文件成功!')