python使用装饰器来统计函数被调用次数、格式化dict以及Python-smtplib邮件发送的IP name possibly forged问题解决

一、python调试:使用装饰器来统计函数被调用次数及格式化dict

    喜欢调试的时候显示数据并显示一些其它的信息,比如区分是哪次调用的调试信息,比如友好的显示dict等相对复杂的数据类型,所以这里涉及到两个方面。一是统计函数被调用次数;二是格式化展示dict数据。

    在类中对一个函数的调用次数进行统计比较方便,直接定义一个类属性来计数即可,但对于一个普通函数这样的方法就不能实现了,于是我们可以通过装饰器来实现。

    装饰器(Decorators)是Python的一个重要功能,它是一个可以修改其他函数的功能的函数。简单地说,装饰器可以让你在一个已经定义的函数的前后去执行其它代码,这有点像JAVA中的AOP切面编程。我们先写一个装饰器类,然后在调用的方法上注明这是一个装饰器,此时再调用方法就会执行显示一个分隔行,同时记录了当前是第几次调用这个调试显示函数,然后再打印要debug的数据。代码如下:

#定义装饰器
class CountClass(object):def __init__ (self, func):self.func = funcself.count = 0def __call__ (self, *args, **kwargs):self.count += 1print("*"*20 + str(self.func.__name__) + ":" +str(self.count) + "*"*20)return self.func(*args, **kwargs)#再来写一个被装饰的函数:
@CountClass
def show(data:any):print(data)#调用
show(data = "123abc")

    针对第二个方面,格式化展示复杂数据,主要是dict类型数据。可以使用官方模块 pprint 格式化打印 dict 数据,python推出pprint正是因为print在显示复杂数据方面的不美观,比如打印一个dict,使用print显示一长串会看花眼。

import pprint
@CountClass
def show(data:any):if isinstance(data, dict):#使用pprint打印显示pp = pprint.PrettyPrinter(indent=4)pp.print(data)#打印jsonprint(json.dumps(data, indent=4, separators=(', ', ': '), ensure_ascii=False))else:print(data)

    但在测试时发现pprint并没有生效,后来发现只有要显示的内容比较长时,pprint才会美观化显示内容,否则会直接展示。不过在使用中通过对比,pprint还是不如直接使用json.dumps来展示美观,一是pprint只对第一层级进行美化展示,对于dict嵌套dict,内部的dict不会被美化;二是pprint在显示的时候{与内容在一行,效果不咋样。

二、Python-smtplib邮件发送Relaying denied. IP name possibly forged[IP地址]

    使用PYTHON-smtplib需要先安装sendmail,使用apt install sendmail命令安装vcb即可,安装完成后sendmail的配置文件在/etc/mail/中,日志文件位于/var/log/目录中,mail.log、mail.err,查看这两个文件信息来定位问题。可以通过命令mail、mailq查看接收到的邮件和待发送的邮件。

$ whereis sendmail
sendmail: /usr/sbin/sendmail /usr/lib/sendmail /usr/share/sendmail

    进行邮件发送代码很少,引入模块定义几个参数执行就行了。代码示例如下:

import smtplib
from email.mime.text import MIMEText
from email.header import Header
import tracebacksender = 'my@cc.com'
receivers = ['user1@cc.com', 'user2@cc.com']#四个参数
message = MIMEText('邮件信息主体', 'plain', 'utf-8')
message['Subject'] = Header('Python smtplib邮件发送测试', 'utf-8')
message['From'] = Header('测试邮件', 'utf-8')
message['To'] = Header('自己', 'utf-8')try:smtpObj = smtplib.SMTP('localhost')smtpObj.sendmail(sender, receivers, message.as_string())print('发送成功...')
except:traceback.print_exc()print('Error: 发送失败')

    在执行过程中遇到报错:smtplib.SMTPRecipientsRefused: {'test@e.com': (550, b'5.7.1... Relaying denied. IP name possibly forged [172.17.0.3]')}。之前我已在服务器中进行了调试并且成功运行,但后面部署到docker容器中运行后就出现了上面的错误。从提示也很清楚看到IP地址不合法,此需要修改mail中的配置,进到mail服务器,在/etc/mail/access文件中添加如下一行:

Connect:  IP地址                  RELAY

        然后使用如下命令使上述编辑过的配置生效即可成功.

makemap hash /etc/mail/access.db < /etc/mail/access

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443671.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】网络相关技术介绍

文章目录 NAT概述NAT的基本概念NAT的工作原理1. **基本NAT&#xff08;静态NAT&#xff09;**2. **动态NAT**3. **NAPT&#xff08;网络地址端口转换&#xff0c;也称为PAT&#xff09;** 底层实现原理1. **数据包处理**2. **转换表**3. **超时机制** NAT的优点NAT的缺点总结 P…

大模型微调十诫:关于将微调模型部署到生产环境的十条建议

转自NLP工程化 大模型微调十诫&#xff1a;关于将微调模型部署到生产环境的十条建议&#xff1a; &#xff08;1&#xff09;不要盲目微调模型&#xff0c;先尝试使用提示的方式满足需求。只有当提示无法达到质量、性能或成本目标时&#xff0c;才考虑微调。 &#xff08;2&…

RabbitMQ延迟队列

1场景&#xff1a; 1.下单之后&#xff0c;给10分钟时间进行支付&#xff0c;如果10分钟后&#xff0c;没有支付&#xff0c;订单取消。&#xff08;可以使用队列的ttl&#xff0c;因为所有的消息都是一样的停留时长10分钟&#xff09; 2.定时发布文章&#xff08;要求4月1号…

MPA-SVM多变量分类预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

JavaScript 数组简单学习

目录 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例

基于java+springboot的旅游信息网站、旅游景区门票管理系统设计与实现

该系统是基于javaspringboot开发的旅游景区门票管理系统。是给师弟开发的大四实习作品。学习过程中&#xff0c;遇到问题可以咨询github作者。 演示地址 前台地址&#xff1a; http://travel.gitapp.cn 后台地址&#xff1a; http://travel.gitapp.cn/admin 后台管理帐号&am…

植物大战僵尸修改器-MFC

创建项目 创建mfc应用 基于对话框 打开资源视图下的 IDD_MFCAPPLICTION2_DIALOG 限制对话框大小 将属性中Border的值改为对话框外框 删除对话框中原有的控件 属性-外观-Caption 设置对话框标题 工具箱中拖放一个按钮 修改按钮名称 将按钮ID改为IDC_COURSE 在MFCApplication2…

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

Golang通用代码生成器:仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式

Golang通用代码生成器&#xff1a;仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式 哑数据模式是一种使用内存数据的为快速原型准备的模式。专门为售前&#xff0c;产品经理和项目经理准备。Golang通用代码生成器支持此种模式&#xff0c;请见视频&#xff1a;https://www.bi…

【Qt+Python项目构建】- 02 Qt creator 14.0 + PySide6 如何让图像控件的尺寸变化和窗口一致

前言&#xff1a;【这是个AI不会回答的问题】 Qt Creator 新的版本又发出了&#xff0c;Pyside6 有很多新功能。但是&#xff0c;一些传统的方法要被淘汰了。 一个经典的例子是&#xff1a; 我有个一个图像要显示在Form里面的图像控件上&#xff0c;OK&#xff0c; 我现在拖…

HarmonyOs 查看官方文档使用弹窗

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后&#xff0c;基本也就入门了&#xff0c;但是有一些操作网上没有找到合适教学的视频&#xff0c;这时&#xff0c;大家就需要养成参考官方文档的习惯了&#xff0c;因为官方的开发文档是我们学习深度任何一门语言或…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

嵌入式硬件设计中EDA布局与布线实现

大家好,今天主要给大家分享一下,如何使用立创EDA进行布局和布线,具体实现过程如下: 第一:PCB概念介绍 在介绍PCB的时候,先来说明一下,电子管的发明史。 贝尔在1876年发明了电话,爱迪生1879年发明了白炽灯、特斯拉于1888年发明了电动机,所有这些,都为电子学的诞生准…

如何修改银河麒麟高级服务器操作系统修改网卡名称(如从ens33到eth0)

如何修改银河麒麟高级服务器操作系统修改网卡名称&#xff08;如从ens33到eth0&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 查找并修改配置文件&#xff1a; 使用ifconfig查看网卡名称&#xff08;如enp1s0&#xff09;。找…

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求&#xff1a; 1. 组建对等网络&#xff0c;会在命令行使用ipconfig&#xff0c;两网络能够相互ping通&#xff0c;尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer&#xff0c;模拟组建对等网并测试对等网 1、组建对等网络 连…

HAL+M4学习记录_4

一、按键 记录学习使用HAL库读取板载按键输入键值 板载三颗按键&#xff0c;引脚配置如下 其中K_UP按键按下为高电平&#xff0c;那么PA0引脚要配置为下拉模式&#xff1b;K0和K1按下为低电平&#xff0c;那么PE4和PE3引脚要配置为上拉模式。 二、通过按键控制LED 这里实现的…

保姆教程篇:手把手教你从零开始本地部署Dify工作流

本教程将指导您在个人电脑上安装和配置 Dify。 为什么需要Dify 在开始具体的教程之前&#xff0c;先搞清楚为什么要选择 Dify。 6 月份&#xff0c;阿里巴巴全球数学竞赛中&#xff0c;首次接受AI参赛。结果令人大跌眼镜&#xff1a;AI选手们的表现完全无法与人类选手相提并…

STM32外设详解——ADC

来源&#xff1a;铁头山羊 基本概念 ①ADC是模数转换器的统称&#xff0c;stm32f103c8t6内部集成了2个12位主次逼近型ADC&#xff0c;外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值&#xff08;分割为2的12次方份&…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的&#xff1a; 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个使用错误消息ID的服务发现SubscribeEve…

YOLO--前置基础词-学习总结(上)

RFBNet是什么意思 RFBNet 是一种用于目标检测的深度学习网络&#xff0c;它的名字来源于 "Receptive Field Block Network"&#xff08;感受野块网络&#xff09;。简单来说&#xff0c;RFBNet 是一种可以让计算机更好地“看”图像中不同大小的物体的方法。 在图像处…