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

    作者:gtea 博客地址:https://www.cnblogs.com/gtea
  • 相关阅读:
    抽象类的练习
    Java异常处理1
    接口的应用
    接口之代理模式
    接口之工厂方法的设计模式
    给ubuntu系统换新装
    2的幂次方表示(OJ 8758)
    Fibonacci【矩阵乘法】(POJ 3070)
    斐波那契公约数(luogu 1306)
    枪战Maf (bzoj 1124)
  • 原文地址:https://www.cnblogs.com/gtea/p/12715681.html
Copyright © 2020-2023  润新知