1、介绍
为了方便存储和操作properties数据,定义Properties类进行处理。
由于各种场景之间的properties数据存在相对固定的差异,因此分别定义子类,继承Properties类,重写部分属性和方法。
- Properties类,通用的properties数据对象。
- Headers类,http请求和响应的头部字段。sep1='\n',sep2=': ',strip_flag=True,ignore_case=True
- Params类,url的直接参数。sep1='&',sep2='=',strip_flag=False,ignore_case=False
- Cookies类,请求头部的cookies字段的值。sep1=';',sep2='=',strip_flag=True,ignore_case=False
2、Properties类和子类
3、api/PropertiesClass
import requests
from api import PropertiesModule
'''
通用对象
'''
class Properties:
def __init__(self, s: str = '', sep1: str = '', sep2: str = '', strip_flag: bool = False,
ignore_case: bool = True):
# 核心对象属性
self.property_list = list()
# 键值对和键值对之间的分隔符
self.sep1 = sep1
# 键和值的分隔符
self.sep2 = sep2
# 该对象解析时,是否对键和值的首尾去除空白字符
self.strip_flag = strip_flag
# 该对象匹配键时,是否忽略大小写
self.ignore_case = ignore_case
if s != '' and sep1 != '' and sep2 != '':
# 去除\r字符
s = s.replace('\r', '')
self.parse(s)
def parse(self, s: str):
# 解析
self.property_list = PropertiesModule.parse(s=s, sep1=self.sep1, sep2=self.sep2, strip_flag=self.strip_flag)
def toString(self):
return PropertiesModule.toString(self.property_list, self.sep1, self.sep2)
def clone(self):
# 创建克隆对象,类型是Properties或其子类
clone_obj = type(self)()
# list的copy是浅克隆,但是这里list的元素都是list,所以不能直接用
clone_obj.property_list = PropertiesModule.clone(self.property_list)
return clone_obj
def hasName(self, name: str):
return PropertiesModule.hasName(self.property_list, name=name, ignore_case=self.ignore_case)
def getFirstValue(self, name: str):
return PropertiesModule.getFirstValue(self.property_list, name=name, ignore_case=self.ignore_case)
def getValue(self, name: str):
return PropertiesModule.getValue(self.property_list, name=name, ignore_case=self.ignore_case)
def remove(self, name: str):
PropertiesModule.remove(self.property_list, name=name, ignore_case=self.ignore_case)
def update(self, name: str, value: str):
PropertiesModule.update(self.property_list, name=name, value=value, ignore_case=self.ignore_case)
def add(self, name, value):
PropertiesModule.add(self.property_list, name, value)
def getNames(self):
return PropertiesModule.getNames(self.property_list)
def get(self, index: int):
return PropertiesModule.get(arr=self.property_list, index=index)
def get_name(self, index: int):
return PropertiesModule.get_name(arr=self.property_list, index=index)
def get_value(self, index: int):
return PropertiesModule.get_value(arr=self.property_list, index=index)
def remove_index(self, index: int):
PropertiesModule.remove_index(arr=self.property_list, index=index)
def update_index(self, index: int, name: str, value: str):
PropertiesModule.update_index(arr=self.property_list, index=index, name=name, value=value)
"""
以下方法是非直接对应函数操作
"""
def update_byStr(self, s):
if s is None or s == '':
return
# 去除\r字符
s = s.replace('\r', '')
arr = PropertiesModule.parse(s, '\n', ':', True)
for item in arr:
if self.hasName(item[0]):
self.update(item[0], item[1])
def update_or_add(self, name: str, value: str):
if self.hasName(name):
self.update(name, value)
else:
self.add(name, value)
def update_or_add_byStr(self, s):
if s is None or s == '':
return
# 去除\r字符
s = s.replace('\r', '')
arr = PropertiesModule.parse(s, '\n', ':', True)
for item in arr:
if self.hasName(item[0]):
self.update(item[0], item[1])
else:
self.add(item[0], item[1])
def size(self):
return len(self.property_list)
def isEmpty(self):
if self.property_list:
return True
else:
return False
"""
请求和响应头部字段
"""
class Headers(Properties):
def __init__(self, obj: str = ''):
super().__init__()
# 核心对象属性
self.property_list = list()
# 键值对和键值对之间的分隔符
self.sep1 = '\n'
# 键和值的分隔符
self.sep2 = ':'
# 该对象解析时,是否对键和值的首尾去除空白字符
self.strip_flag = True
# 该对象匹配键时,是否忽略大小写
self.ignore_case = True
if type(obj) == str and obj != '':
# 直接的请求报文,截取头部字段字符串部分
obj: str = obj.replace('\r', '')
self.property_list = PropertiesModule.parse(obj, '\n', ':', True)
elif type(obj) == requests.structures.CaseInsensitiveDict:
# requests.res.headers和requests.res.request.headers的类型
obj: requests.structures.CaseInsensitiveDict
for name, value in obj.items():
self.property_list.append([name, value])
"""
参数
"""
class Params(Properties):
def __init__(self, s: str = ''):
super().__init__(s)
# 键值对和键值对之间的分隔符
self.sep1 = '&'
# 键和值的分隔符
self.sep2 = '='
# 该对象解析时,是否对键和值的首尾去除空白字符
self.strip_flag = False
# 该对象匹配键时,是否忽略大小写
self.ignore_case = False
if type(s) == str and s != '':
# 去除\r字符
s = s.replace('\r', '')
self.property_list = PropertiesModule.parse(s, self.sep1, self.sep2, self.strip_flag)
"""
请求头部cookies字段
"""
class Cookies(Properties):
def __init__(self, s: str = ''):
super().__init__(s)
# 键值对和键值对之间的分隔符
self.sep1 = ';'
# 键和值的分隔符
self.sep2 = '='
# 该对象解析时,是否对键和值的首尾去除空白字符
self.strip_flag = True
# 该对象匹配键时,是否忽略大小写
self.ignore_case = False
if type(s) == str and s != '':
# 去除\r字符
s = s.replace('\r', '')
self.property_list = PropertiesModule.parse(s, self.sep1, self.sep2, self.strip_flag)