- 为 core 目录下主要模块 (models, context, creator, base_api, exchange, executor) 添加了详细的类和方法 Docstring。 - 新增 docs/架构改进.md 文件。
101 lines
3.0 KiB
Python
101 lines
3.0 KiB
Python
#!/usr/bin/env python
|
||
# coding=utf-8
|
||
|
||
"""
|
||
@author: chen wei
|
||
@Software: PyCharm
|
||
@contact: t6i888@163.com
|
||
@file: session.py
|
||
@date: 2024/9/12 21:56
|
||
@desc:
|
||
"""
|
||
import logging
|
||
from urllib.parse import urljoin
|
||
|
||
import requests
|
||
from requests import Response, PreparedRequest
|
||
import allure
|
||
|
||
|
||
# logger = logging.getLogger("requests.session")
|
||
logger = logging.getLogger(__name__)
|
||
# logging.basicConfig(level=logging.INFO)
|
||
|
||
|
||
class Session(requests.Session):
|
||
"""
|
||
自定义会话管理类,继承自 requests.Session。
|
||
|
||
增强功能:
|
||
1. Base URL 管理:支持相对路径自动拼接。
|
||
2. Allure 集成:自动将请求操作包装为 Allure 步骤。
|
||
3. 日志记录:详细记录请求和响应的 头部、正文、状态码等信息。
|
||
"""
|
||
|
||
def __init__(self, base_url=None):
|
||
"""
|
||
初始化会话。
|
||
|
||
Args:
|
||
base_url: 基础 URL,用于拼接相对路径请求。
|
||
"""
|
||
super().__init__() # 先执行父类的初始化
|
||
self.base_url = base_url # 在执行子类的初始化操作
|
||
|
||
@allure.step("发送请求")
|
||
def request(self, method, url: str, *args, **kwargs) -> Response:
|
||
"""
|
||
发送 HTTP 请求(重写)。
|
||
|
||
逻辑:
|
||
1. 如果 url 是相对路径,自动拼接 base_url。
|
||
2. 记录 Allure 步骤。
|
||
|
||
Args:
|
||
method: 请求方法 (GET, POST, etc.)
|
||
url: 请求 URL (支持相对路径)
|
||
*args: 透传给 requests.Session.request 的位置参数
|
||
**kwargs: 透传给 requests.Session.request 的关键字参数
|
||
|
||
Returns:
|
||
Response: 响应对象
|
||
"""
|
||
if not url.startswith("http"):
|
||
# 自动添加baseurl
|
||
url = urljoin(self.base_url, url)
|
||
return super().request(method, url, *args, **kwargs) # 按照原有方式执行
|
||
|
||
def send(self, request: PreparedRequest, *args, **kwargs) -> Response:
|
||
"""
|
||
发送底层 PreparedRequest(重写)。
|
||
|
||
逻辑:
|
||
1. 记录请求详细日志 (URL, Headers, Body)。
|
||
2. 执行真实网络请求。
|
||
3. 记录响应详细日志 (Status, Headers, Body)。
|
||
|
||
Args:
|
||
request: 已准备好的请求对象
|
||
*args: 透传参数
|
||
**kwargs: 透传参数
|
||
|
||
Returns:
|
||
Response: 响应对象
|
||
"""
|
||
logger.info(f"发送请求>>>>>> 接口地址 = {request.method} {request.url}")
|
||
logger.info(f"发送请求>>>>>> 请求头 = {request.headers}")
|
||
logger.info(f"发送请求>>>>>> 请求正文 = {request.body} ")
|
||
|
||
resp = super().send(request, **kwargs) # 按照原有方式发送请求
|
||
|
||
logger.info(f"接收响应 <<<<<< 状态码 = {resp.status_code}")
|
||
logger.info(f"接收响应 <<<<<< 响应头 = {resp.headers}")
|
||
logger.info(f"接收响应 <<<<<< 响应正文 = {resp.text}")
|
||
# logger.info(f"接收响应 <<<<<< 响应正文 = {resp.json()}")
|
||
|
||
return resp
|
||
|
||
|
||
if __name__ == '__main__':
|
||
...
|