1、单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时, 单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为。 --以上来自维基百科。
2、这里主要用来处理测试用例执行时每次都会调用登录的问题。添加单例模式+登录校验,实现了登录所在类只会实例化一次,且已经登录过时不会再进行登录初始化。
3、其中引用logging模块实现log打印。
4、该类被实例化时,优先调用new方法,判断是否已被实例化,如果未被实例化,则实例化该对象,并把该实例存在该类的_instance属性中,否则,直接返回该类的_instance实例;执行完new方法后,会执行init方法进行初始化,init方法每次都会被执行。
# _*_coding:utf-8 _*_
import json
import requests
import logging
import logging.handlers
class Http(object):
def __init__(self):
self.login_url = "xxx"
self.my_url = "xxx"
self.login_data = {
"username":"xxx",
"password":"xxx"
}
self.session = self.is_session()
def is_session(self):
try:
session_id = id(self.session)
if isinstance(session_id, int):
return self.session
except AttributeError as e:
print(format(e))
self.session = self.login()
return self.session
def __new__(cls):
if not hasattr(cls, '_instance'):
cls._instance = super(Http, cls).__new__(cls)
return cls._instance
def login(self):
# LOG_FILE = 'tst.log'
#
# handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5) # 实例化handler
# fmt = '%(asctime)s - %(name)s - %(message)s'
#
# formatter = logging.Formatter(fmt) # 实例化formatter
# handler.setFormatter(formatter) # 为handler添加formatter
#
# logger = logging.getLogger('tst') # 获取名为tst的logger
# logger.addHandler(handler) # 为logger添加handler
# logger.setLevel(logging.DEBUG)
#
# logger.info('first info message')
session = requests.session()
session.post(self.login_url, data=self.login_data)
# logger.info('end message')
return session
def post(self, params):
req = self.session.post(self.my_url, data=params)
# r.close()
data = req.text
# print(data)
try:
print('尝试第一次解析')
json_str = json.loads(data)
json_dict = eval(json_str)
return json_dict
except Exception as e:
print('第一次解析失败:', format(e))
try:
print('尝试第二次解析')
# 尝试替换原始字符串中的转义单引号
json_str = eval(data).replace('\'', '"')
json_str = json.loads(json_str)
return json_str
except Exception as e:
print('第二次解析失败错误原因:', format(e))
try:
print('尝试第三次解析')
json_str = json.loads(data)
return json_str
except Exception as e:
print('第三次解析失败错误原因:', format(e))
if __name__ == '__main__':
http = Http()
http.post()