一、URL编码解码
url的编码解码需要用到标准模块urllib中的parse方法
1 from urllib import parse 2 url = 'http://www.baidu.com?query=python基础教程 $%^&' 3 url_str = parse.quote_plus(url) # url编码 4 baidu_url = 'http%3A%2F%2Fwww.baidu.com%3Fquery%3Dpython%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B+%24%25%5E%26' 5 baidu_url_str = parse.unquote_plus(baidu_url) # url解码
二、if __name__ == '__main__'
Python不同于C/C++,程序并不需要执行主程序main()这样的程序入口,而是文件自上而下的编译执行。在很多Python程序中都会有下面这样的语句:
1 if __name__ == '__main__': 2 pass
这条语句的作用是判断这个Python文件是别的地方导入的还是直接运行的,一般是调试代码的时候使用,在它下面会写一些调试的代码。如果直接运行这个文件就会执行它下面的调试代码,如果通过其他文件导入这个文件执行,就不会运行它下面的调试代码,因为直接运行这个文件时,__name__的结果就是__main__,可以通过print(__name__)来验证。
三、练习
签名规则计算:
1、请求数据:vendorId=100&ip=127.0.0.1&Version=2.0&mac=D4-81-D7-CA-20-29
2、商家编码:vendorId
3、计算规则:
(1) 将商家编码(vendorId)进行2次md5加密,得到一个字符串Astr
(2) 再将请求数据进行一次urlDecode处理,得到一个字符串urlDecodeStr
(3) Astr+urlDecodeStr再进行一次md5加密获得最终的签名
1 from urllib import parse 2 import hashlib 3 class Sign(object): 4 def __init__(self,req_data): 5 self.req_data = req_data # 这写了self的话,在其他的函数里面也可以用self.xx 6 self.get_vendorId() # 构造函数中调用类里面的函数 7 self.get_sign() # 构造函数中调用类里面的函数 8 def my_md5(self,str): 9 md = hashlib.md5() 10 md.update(str.encode()) 11 return md.hexdigest() 12 def get_vendorId(self): 13 data_dic = {} 14 sub_str = self.req_data.split('&') 15 for i in sub_str: 16 data_dic[i.split('=')[0]] = i.split('=')[1] 17 self.vendorid = data_dic.get('vendorId') 18 def get_sign(self): 19 Astr = self.my_md5(self.my_md5(self.vendorid)) # 两次md5加密 20 urlDecodeStr = parse.quote_plus(self.req_data) # url编码 21 beforeMD5 = Astr + urlDecodeStr 22 self.sign = self.my_md5(beforeMD5) 23 return self.sign 24 25 if __name__ == '__main__': 26 # 请求数据: 27 s = 'vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;' 28 # 实例化: 29 s_sign = Sign(s) 30 print(s_sign.get_sign()) # 构造函数里面如果没有调用,这里需要调用函数 31 print(s_sign.sign) # 构造函数里面如果已经调用了函数,这里可以直接用返回值
此时直接运行该文件的结果为:
afaa051aa024628edf92c85b66f3eefe afaa051aa024628edf92c85b66f3eefe
如果是以模块的形式导入运行该文件,则if __name__ == '__main__'下面的这几行代码不会执行