从0开始python学习-42.requsts统一请求封装

统一请求封装的目的:

1.去除重复的冗余的代码

2. 跨py文件实现通过一个sess来自动关联有cookie关联的接口。

3. 设置统一的公共参数,统一的文件处理,统一的异常处理,统一的日志监控,统一的用例校验等

封装前原本代码:

py文件一:

class TestShop:
    session = requests.session()

    def test_start_list(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            'application':'app',
            'application_client_type':'h5',
            's':'index/index'
        }
        res = TestShop.session.request(method=method,url=url,params=params)
        print(res.json())

    def test_product_detail(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            'application':'app',
            'application_client_type':'h5',
            's':'goods/detail'
        }
        json = {
            "goods_id": "12"
            }
        res = TestShop.session.request(method=method,url=url,params=params,json=json)
        print(res.json())

py文件二:

class TestApi:
    access_token = ''
    session = requests.session()  
    def test_phpwind(self):
        url = 'http://47.107.116.139/phpwind/'
        res = TestApi.session.request(method="get",url=url)

        res_token = re.search('name="access_token" value="(.*?)"',res.text)
        TestApi.access_token = access_token.group(1)
        print(TestApi.access_token)
        
def test_file_upload(self):
    url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
    params = {
        'access_token':TestApi.access_token
    }

    # 封装前文件上传
    file = {
        'media':open('D:\\1.jpg','rb')
    }
    res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
    print(res.json())

从这两个代码可以看出,两个py文件都创建了session回话,且在第一个py文件中有params的冗余部分,则可以将请求统一封装到一个session进行调用,去除的冗余的同时,若params内容需要修改也只用修改一个即可,并且将文件上传进行封装后代码中只需要上传文件路径即可

虽然在公共参数中的public_params只作用于一个py文件,但是对于另外一个文件虽然多余了但是不会产生影响

统一封装请求:

class RequestUtil:

    session = requests.session()
    def send_request(self,**kwargs):

        # 公共参数
        public_params = {
            'application': 'app',
            'application_client_type': 'h5'
        }
        for key,value in kwargs.items():
            if key == "params":
                kwargs['params'].update(public_params)
            if key =='files':
                # 此时请求接口中的file的值为value.items(),可能会有多个文件,所以是一个列表
                for file_key,file_value in value.items():
                    # 文件上传中的key则为value[file_key],value为file_value
                    value[file_key] = open(file_value,'rb')

        # 公共请求
        res = RequestUtil.session.request(**kwargs)
        return res

修改后代码一:

class TestShop:
    token = ''

    #首页列表接口
    def test_start_list(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            's':'index/index'
        }
        res = RequestUtil().send_request(method=method,url=url,params=params)
        print(res.json())


    # 商品列表接口
    def test_product_detail(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            's':'goods/detail'
        }
        json = {
            "goods_id": "12"
            }
        res = RequestUtil().send_request(method=method,url=url,params=params,json=json)
        print(res.json())

修改后代码二:

class TestApi:
    access_token = ''
    def test_phpwind(self):
        url = 'http://47.107.116.139/phpwind/'
        res = RequestUtil().send_request(method="get",url=url)
        # print(res.text)

        # 因为token是在文本中,通过正则表达式的方式获取token
        access_token = re.search('name="access_token" value="(.*?)"',res.text)
        TestApi.access_token = res_token.group(1)
        print(TestApi.csrf_token)
        
def test_file_upload(self):
    url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
    params = {
        'access_token':TestApi.access_token
    }

    # 封装后文件上传,只需要写入路径
    file = {
        'media':'D:\\1.jpg'
        }
    res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
    print(res.json())

 文件上传封装:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

Kubernetes二进制部署 单节点

一、环境准备 k8s集群master1&#xff1a;192.168.229.90 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群node1: 192.168.229.80 kubelet kube-proxy docker flannel k8s集群node2: 192.168.229.70 kubelet kube-proxy docker flannel 至少2C2G 常见的k…

软件工程:数据流图相关知识和多实例分析

目录 一、数据流图相关知识 1. 基本介绍 2. 常用符号 3. 附加符号 二、数据流图实例分析 1. 活期存取款业务处理系统 2. 工资计算系统 3. 商业自动化系统 4. 学校人事管理系统 5. 教材征订系统 6. 高考录取统分子系统 7. 订货系统 8. 培训中心管理系统 9. 考务处…

【动态规划】【字符串】C++算法:140单词拆分

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode140:单词拆分 II 给定一个字符串 s 和一个字符串字典 wordDict &#xff0c;在字符串 s 中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。以任意顺序 返回…

PyTorch|一次画一批图像

想想这样一个场景&#xff0c;我们训练了一个神经网络&#xff0c;输入一些信息&#xff0c;这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张&#xff0c;而是多张&#xff0c;我们想把这些图片一次全部显示出来&#xff0c;而不是一张一张的显示&#xff08;这…

【JAVA】异常体系

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Exception&#xff08;异常&#xff09;: Error: 结语 我的其他博客 前言 在Java编程中&#xff0c;异常处理是一个至关…

什么?谁?w (who what)

文章目录 什么&#xff1f;谁&#xff1f;w (who & what)默认的显示不显示标题行简洁模式显示更多信息 什么&#xff1f;谁&#xff1f;w (who & what) w可以认为是加强版的who&#xff0c;果然越简洁越强大&#xff0c;就比如less比more是功能更多的。 w不仅可以显示…

leetcode:2451. 差值数组不同的字符串(python3解法)

难度&#xff1a;简单 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &#xff0c;其中对于 0 < j < n - 2 有 difference[i]…

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…

LLM之RAG实战(十三)| 利用MongoDB矢量搜索实现RAG高级检索

想象一下&#xff0c;你是一名侦探&#xff0c;身处庞大的信息世界&#xff0c;试图在堆积如山的数据中找到隐藏的一条重要线索&#xff0c;这就是检索增强生成&#xff08;RAG&#xff09;发挥作用的地方&#xff0c;它就像你在人工智能和语言模型世界中的可靠助手。但即使是最…

实战演练 | Navicat 中编辑器设置的配置

Navicat 是一款功能强大的数据库管理工具&#xff0c;为开发人员和数据库管理员提供稳健的环境。其中&#xff0c;一个重要功能是 SQL 编辑器&#xff0c;用户可以在 SQL 编辑器中编写和执行 SQL 查询。Navicat 的编辑器设置可让用户自定义编辑器环境&#xff0c;以满足特定的团…

MobaXterm SSH 免密登录配置

文章目录 1.简介2.SSH 免密登录配置第一步&#xff1a;点击 Session第二步&#xff1a;选择 SSH第三步&#xff1a;输入服务器地址与用户名第四步&#xff1a;设置会话名称第五步&#xff1a;点击 OK 并输入密码 3.密码管理4.小结参考文献 1.简介 MobaXterm 是一个功能强大的终…

如何科学地防范冬季流感

如何科学地防范冬季流感 加强对呼吸系统传染病预防的观念 在乘坐地铁、公交、火车、飞机等公共交通工具时&#xff0c;应科学佩戴口罩。要经常洗手&#xff0c;定期通风&#xff0c;咳嗽或打喷嚏时要用手捂住口鼻&#xff0c;不要随地吐痰。 羊大师建议积极接种含有XBB变异株…

基于树种算法优化的Elman神经网络数据预测 - 附代码

基于树种算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于树种算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于树种优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

实现网页跟随系统主题切换

如何实现网页跟随系统主题切换&#xff1f;想必大家都是用过媒体查询media (prefers-color-scheme: dark) 实现亮/暗主题的切换&#xff0c;那如何让其跟随系统自动切换呢&#xff1f;在window对象上&#xff0c;有matchMedia这个API可以帮助我们解决这个问题。它和css中的媒体…

微信小程序启用组件按需注入

微信小程序在预览或上传的时候会进行代码质量检测&#xff0c;有时候会提示‘组件需按需注入’&#xff0c;如下图所示&#xff1a; 这是只要加一句代码"lazyCodeLoading": "requiredComponents" 就行了 &#xff0c;添加的位置在app.json文件的里面&#…

开源协议简介和选择

软件国产化已经提到日程上了&#xff0c;先来研究一下开源协议。 引言 在追求“自由”的开源软件领域的同时不能忽视程序员的权益。为了激发程序员的创造力&#xff0c;现今世界上有超过60种的开源许可协议被开源促进组织&#xff08;Open Source Initiative&#xff09;所认可…

Vue2 实现内容拖拽或添加 HTML 到 Tinymce 富文本编辑器的高级功能详解

在 Web 开发中&#xff0c;Tinymce 被广泛应用作为富文本编辑器。除了基础的文本编辑功能&#xff0c;Tinymce 还提供了一系列高级功能&#xff0c;使得文本编辑更加灵活和便捷。本文将介绍如何在 Tinymce 中实现一些高级功能&#xff0c;并深入了解每个工具的使用。 Tinymce …

COMSOL 各版本安装指南

COMSOL下载链接 https://pan.baidu.com/s/1Z7kaOhyenAOsEqzG57PwhQ?pwd0531 1.鼠标右击【COMSOL6.2(64bit)】压缩包(win11及以上系统先点击“显示更多选项”&#xff09;选择【解压到 COMSOL6.2(64bit)】。 2.鼠标右击【setup】选择【以管理员身份运行】。 3.选择【简体中文…

J2 - ResNet-50v2实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境步骤环境设置数据准备图像信息查看 模型设计ResidualBlock块stack堆叠resnet50v2模型 模型训练模型效果展示 总结与心得体会 环境…