#!/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__': ...