• Pytho自动化 —— requests请求封装


    前言

    为发起请求时能输出日志,所以对requests做二次封装。

    config.py文件封装日志,使用loguru模块。

    from pathlib import Path
    from loguru import logger as log
    
    # 项目根路径
    BASE_PATH = Path(__file__).parent.parent
    
    # 日志配置
    log.add(BASE_PATH.joinpath("logs/app.log"), encoding="utf-8", level="INFO")
    log.add(BASE_PATH.joinpath("logs/警告日志.log"), level="WARNING", encoding="utf-8",
            filter=lambda x: "WARNING" in x['level'].name)
    log.add(BASE_PATH.joinpath("logs/致命错误日志.log"), level="ERROR", encoding="utf-8",
            filter=lambda x: "ERROR" in x['level'].name)
    

    base_requests.py封装requests请求

    import functools
    import json
    
    import allure
    import requests
    
    from config.settings import log, CLIENT_TOKEN, ADMIN_TOKEN, PC_TOKEN
    
    str_req = """
    ----------------请求参数----------------
    请求URL    : 【{url}】
    请求METHOD : 【{method}】
    请求HEADER : 【{header}】
    请求BODY   : 【{body}】
    """
    
    str_resp = """
    ----------------响应参数----------------
    响应CODE   : 【{code}】
    响应HEADER : 【{header}】
    响应BODY   : 【{body}】
    """
    
    
    class BaseRequest:
    
        # 处理请求字符串格式化,打印日志输出。
        @staticmethod
        def format_requests(*args, **kwargs):
            method, url = args
            headers = kwargs.pop("headers", None)
            try:
                body = json.dumps(kwargs, sort_keys=True, indent=2, ensure_ascii=False)
                log.info(str_req.format(url=url, method=method, body=body, header=headers))
            except Exception:
                log.error("请求数据无法序列化-------")
    
        # 处理响应字符串格式化,打印日志输出。
        @staticmethod
        def format_response(response):
            body = json.dumps(response.json(), sort_keys=True, indent=2, ensure_ascii=False)
            log.info(str_resp.format(code=response.status_code, header=response.headers, body=body))
    
        # 处理请求头数据
        @staticmethod
        def dispose_headers(headers):
            default_header = {}
            if headers == CLIENT_TOKEN:
                default_header['Authorization'] = "Bearer " + CLIENT_TOKEN
            elif headers == ADMIN_TOKEN:
                default_header['Authorization'] = "Bearer " + ADMIN_TOKEN
            elif headers == PC_TOKEN:
                default_header['Authorization'] = "Bearer " + PC_TOKEN
            else:
                return headers
            return default_header
    
    
    def log_request(func):
        """发起请求的函数写成装饰器"""
        @functools.wraps(func)
        def wrap(*args, **kwargs):
            kwargs['headers'] = BaseRequest.dispose_headers(kwargs.get('headers'))
            BaseRequest.format_requests(*args, **kwargs)
            response = func(*args, **kwargs)
            BaseRequest.format_response(response)
            return response
    
        return wrap
    
    
    def allure_attach(func):
        """写入allure报告的装饰器"""
        @functools.wraps(func)
        def wrap(*args, **kwargs):
            method, url = args
            headers = BaseRequest.dispose_headers(kwargs.get("headers"))
            body_json = kwargs.get("json")
            request_json = {"【url】": url, "【method】": method, "【headers】": headers, "【json】": body_json}
            allure.attach(json.dumps(request_json, indent=4, ensure_ascii=False), "请求参数")
            response_json = func(*args, **kwargs)
            allure.attach(json.dumps(response_json.json(), indent=4, ensure_ascii=False), "响应结果")
            return response_json
    
        return wrap
    
    
    @log_request
    @allure_attach
    def mi_request(method, url, **kwargs):
        try:
            return requests.request(method, url, **kwargs)
        except Exception as e:
            log.error(e)
            raise e
    
    
  • 相关阅读:
    如何把项目部署到OSChina上
    读书笔记----10日摘抄整理(05)
    读书笔记----10日摘抄整理(04)
    读书笔记----10日摘抄整理(03)
    读书笔记----10日摘抄整理(02)
    读书笔记----10日摘抄整理(01)
    前五题半
    作业3
    作业: 1.8(圆的面积和周长)编写程序,使用以下的公式计算并显示半径为5.5的圆的面积和周长。
    作业:1.12假设一个跑步者1小时40分钟35秒 内跑了24英里。编写一个程序显示以每小时多少公里为单位的平均速度值(注意,1英里等于1.6公里。)
  • 原文地址:https://www.cnblogs.com/se7enjean/p/15193678.html
Copyright © 2020-2023  润新知