【Python学习】URL编码解码&if __name__ == '__main__'

一、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__'下面的这几行代码不会执行

posted @ 2020-04-16 20:59  gtea  阅读(296)  评论(0编辑  收藏  举报