Django+Celery学习笔记5——定时推送消息
引言
本文紧接着上一篇来讲,如果不清楚请从头看:学习笔记4
实例场景
前面学习了Celery定时任务,那么在现实中最常用到的就是定时发送消息和邮件了。现在学习一下。
定时推送钉钉消息
场景:通常会建一个生产环境预警群,通过监控服务是否正常,如果有异常,钉钉群API捕捉异常后,定时自动推送到群里,这样以来,大家可以及时收到,然后跟踪处理问题。
钉钉开放平台:https://ding-doc.dingtalk.com/doc#/serverapi2/elzz1p
这里需要做的是,钉钉推送消息的设置,而不是推送什么消息,消息内容获取方式很多,根据自己的来!
修改tasks.py代码,如下:
from __future__ import absolute_import, unicode_literals from djangocelerydemo.celery import app import requests,json @app.task def task_send_dd_text(url, msg, atMoblies, atAll="flase"): """ 发送钉钉提醒 :param url: :param msg: :param atMoblies: :param atAll: :return: """ body = { "msgtype": "text", "text": { "content": msg }, "at": { "atMobiles": atMoblies, # 被艾特人的手机号码 "isAtAll": atAll } } headers = {'content-type': 'application/json', } r = requests.post(url, headers=headers, data=json.dumps(body)) print(r.text) @app.task def dd_task(): url = 'https://oapi.dingtalk.com/robot/send?access_token=****************************' task_send_dd_text.delay(url=url,msg='【钉钉消息播报】:\n test-services服务正常\n test-manager服务正常\n',atMoblies=["18612345678"],atAll='true')
其他代码不变。
进入到后台界面设置定时任务,如图:
通过设置定时任务执行test_dd函数,而test_dd函数内部是异步执行推送钉钉消息的函数task_send_dd_text。
结果如下:
钉钉群的消息如下:
到此钉钉推送消息讲完!
定时发送邮件
这里发送邮件使用django自带的发邮件EmailMultiAlternatives。
具体代码如下:
在setting.py文件中设置:
# django发送邮件 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = False #是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。) EMAIL_USE_SSL = False #是否使用SSL加密,qq企业邮箱要求使用 EMAIL_HOST = 'smtp.126.com' # 如果是 163 改成 smtp.163.com EMAIL_PORT = 25 EMAIL_HOST_USER = '####@126.com' # 帐号 EMAIL_HOST_PASSWORD = '####' # 密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
任务计划场景设置如下:
from django.core.mail import send_mail,send_mass_mail from __future__ import absolute_import, unicode_literals @app.task def task_send_mail(*args, **kwargs): """ django 的 发送邮件,支持 html,html_message="html 内容" :param args: :param kwargs: :return: """ # message = ('Subject1 here', 'Here is the message', '', ['136633063@qq.com']) try: send_mail('自动发送邮件测试', '这里是邮件消息内容', '', ['136633063@qq.com'],fail_silently=False) except Exception as e: print("失败信息:%s"%e) return {"msg":"发送失败"} else: return {"msg":"发送成功"}
配置定时任务计划,如下:
查看消费结果:
查看邮件内容,如下:
以上就是单个文本邮件发送方式。
多邮件发送
以上是单个邮件发送,如果模拟多个用户发送不同的邮件,该怎么操作?
django操作很简单,如下:
from django.core.mail import send_mail,send_mass_mail import django import os # 防止报错 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangocelerydemo.settings") # project_name 项目名称 django.setup() message1 = ('Subject1 here', 'Here is the message', '', ['136633063@qq.com']) message2 = ('Subject2 here', 'Here is the message', '', ['136633063@qq.com']) from email.header import make_header # 单个邮件 # send_mail('Subject1 here', 'Here is the message', '', ['136633063@qq.com'],fail_silently=False) # 多个邮件 send_mass_mail((message1,message2), fail_silently=False)
发送完后,你会收到两份邮件如下:
邮件带附件发送
以上都是文本方式发送,那么要发送附件呢?
django使用EmailMultiAlternatives模块可以完成附件的发送,如下:
from django.core.mail import EmailMultiAlternatives from email.header import make_header subject = '定时任务测试邮件附件主题' text_content = '这是一封重要的邮件.' html_content = '<p>这是一封<strong>重要的</strong>邮件.</p>' msg = EmailMultiAlternatives(subject, text_content, '', ['136633063@qq.com']) msg.attach_alternative(html_content, "text/html") # 发送附件 file_path = r"E:\djangocelerydemo\test附件.html" # 发送附件的文件路径 text = open(file_path, 'rb').read() file_name = os.path.basename(file_path) # 对文件进行编码处理 b = make_header([(file_name, 'utf-8')]).encode('utf-8') msg.attach(b, text) # 传入文件名和附件 try: msg.send() except Exception as e: print(e) else: print("发送成功!") finally: print("程序结束!")
结果如下:
邮件内容:
以上就是django自动发送邮件功能。
总结
目前结合celery将自动推送消息:群消息+邮件已经讲完,如果有兴趣的可以深入研究一下。也可以加入我们学习交流群沟通学习,一起进步!
作者:全栈测试开发日记
出处:https://www.cnblogs.com/liudinglong/
csdn:https://blog.csdn.net/liudinglong1989/
微信公众号:全栈测试开发日记
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。