def __init__(self)
分析项 内容/描述 ** __init__(self)
**类的初始化方法,用于设置实例的默认请求头( self.headers
)和响应处理对象(self.handle_response
)。** self.headers
**固定 HTTP 请求头:
{"Content-Type": "application/json; charset=UTF-8", "locale": "zh_cn"}
作用:
1. 声明数据为 JSON 格式,编码为 UTF-8
2. 设置接口语言为简体中文(zh_cn
)。** self.handle_response
**实例化 HandleResponse
对象,用于处理 HTTP 响应(如解析响应数据、校验状态码、提取动态参数等)。
def __hanele_headers(self)
分析项 所用模块/函数 解决的问题 ** __hanele_headers(self)
**hasattr
+getattr
+format
动态处理请求头:
根据HandleAttr
类是否包含access_token
属性,决定是否添加Authorization
鉴权头。** hasattr
**Python 内置函数 安全检查 HandleAttr
类中是否存在access_token
属性,避免因属性不存在导致程序崩溃。** getattr
**Python 内置函数 获取 HandleAttr
类中的access_token
属性值,用于生成鉴权 Token。** format
**字符串方法 将 Token 值格式化为 Authorization: bearer {token}
的标准鉴权头格式。
def __upload_image(self,method,url)
代码片段 描述 __upload_image(self, method, url)
- 私有方法:仅供类内部调用,外部不可直接访问(以双下划线
__
开头)
- 封装图片上传逻辑
- 动态设置请求头并发送请求
- 上传后重置默认请求头。
with open(file=image_dir, mode="rb") as image
with:
Python 关键字open(file=,mode=) as image:open是python内置函数
** MultipartEncoder(fields={...})
**
import re #re模块处理正则表达式 import requests from requests_toolbelt.multipart import MultipartEncoder #使用 requests_toolbelt 发multipart/form-data请求 from tools.handle_attribute import HandleAttr from tools.handle_reponse import HandleResponse from tools.handle_path import image_dir from conf.setting import image_info class HandleRequests: def __init__(self): self.headers = {"Content-Type": "application/json; charset=UTF-8", "locale": "zh_cn"} self.handle_response = HandleResponse() #判断接口需要token和不需要token def __hanele_headers(self): if hasattr(HandleAttr,"access_token"): token = getattr(HandleAttr,"access_token") self.headers["Authorization"]="bearer{}".format(token) #字符串格式化 else: print("该接口不需要鉴权") # 图片上传请求处理(管理端后台上传图片) def __upload_image(self,method,url): #with语法自动关闭文件流,不需要file.close();file=image_dir文件绝对路径或相对路径;mode="rb"文件操作模式,r只读,b二进制方式;open函数负责打开文件; with open(file=image_dir,mode="rb") as image: from_data = MultipartEncoder(fields={ # "file":("图片的名称.jpg","图片的二进制流","image/jpeg") "file": (image_info["file_name"], image, image_info["file_type"]) }) self.headers["Content-Type"]=from_data.content_type #记得缩进 response = requests.request(method=method,url=url,data=from_data,headers=self.headers) self.headers["Content-Type"] ="application/json; charset=UTF-8" return response #请求接口地址替换数据 def __replace_url(self,url:str): #在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;url是待匹配的子串; key_list = re.findall("#(\w.+?)#",url) if len(key_list)>0: for key in key_list: url = url.replace(f"#{key}#",str(getattr(HandleAttr,key))) print("替换后的请求地址:",url) return url else: print("不需要替换请求地址的数据") return url #函数返回值放在return关键字后面,return后面什么也不写,或return也不写默认返回none; # 发送请求方法封装 def send_requests(self,method,url,data,is_upload): # 鉴权请求头处理,有token和无token self.__hanele_headers() # 请求地址参数替换 new_url = self.__replace_url(url=url) if str(is_upload) == "1": # 图片上传接口 # 写图片上传的代码逻辑 response = self.__upload_image(method=method,url=new_url) new_response = self.handle_response.handle_response(response=response) print("图片上传接口返回:",new_response) return new_response else: # 普通接口,需要token 和不需要token response = requests.request(method=method,url=new_url,json=data,headers=self.headers) new_response = self.handle_response.handle_response(response=response) return new_response