Python如何将重复的用户通知代码封装为可传参的helper函数优化
实现思路
核心是把两类用户通用的「遍历用户→生成消息→发短信→发邮件」逻辑抽离出来,把差异化的消息生成规则作为参数传入即可,完全可以实现你要的两次调用完成所有逻辑的效果。
具体代码实现
1. 先定义基础模板和消息生成规则
# 原有基础消息模板直接保留 base_msg = "Hello %s, %s. \n \n***To change your password, press CTRL + ALT + DEL and select change password***.\n\n\n- MY COMPANY IT" # 定义两类用户的消息生成逻辑 notify_msg = lambda user: base_msg % (user['Name'], f"you have {user['Days']} days left to reset your password.") expired_msg = lambda user: base_msg % (user['Name'], "your password has expired, please change it asap to avoid any issues that could occur with your account")
2. 封装通用notify helper函数
import requests from twilio.rest import Client # 提前定义好配置常量即可 twilio_account_sid = "你的twilio账户SID" twilio_auth_token = "你的twilio授权token" twilio_from_phone_number = "你的twilio发信号码" mailgun_api = "你的mailgun接口密钥" def notify(user_list, msg_generator): # 初始化twilio客户端,单次调用仅初始化一次 client = Client(twilio_account_sid, twilio_auth_token) mailgun_api_url = "https://api.mailgun.net/v3/MYDOMAIN/messages" for user in user_list: # 按传入的规则生成对应消息 full_msg = msg_generator(user) # 发送短信 message = client.messages.create( to=user['Number'], from_=twilio_from_phone_number, body=full_msg ) print(message.sid) # 发送邮件,这里修正了你原代码对self.app.config.get的错误使用:config.get是用来读取配置项的,不要套在请求参数上 requests.post( mailgun_api_url, auth=("api", mailgun_api), data={ "from": "IT <mailgun@MYDOMAIN>", "to": user['Email'], "subject": "Password Reminder", "text": full_msg } )
3. 按你需要的形式调用
# 发送待过期用户通知 notify(notify_users, notify_msg) # 发送已过期用户通知 notify(expired_users, expired_msg)
可选优化建议
- 可以在发送逻辑中增加
try-except异常捕获,避免单个用户发送失败导致整个任务中断,也可以按需添加失败重试逻辑 - 如果通知任务触发频率高,可以把twilio客户端的初始化提到函数外部,避免重复创建实例浪费资源
- 可以给函数增加返回值,返回发送成功/失败的用户列表,方便后续统计对账
内容的提问来源于stack exchange,提问作者troy
相关产品推荐
相关产品推荐

