Python Web开发库之vcrpy 使用详解

news2024/9/23 19:19:05


概要

在现代Web开发中,HTTP请求是不可避免的一部分。然而,通过网络发送HTTP请求可能会导致一些问题,如慢速响应、网络不稳定和API限制。为了解决这些问题,Python社区开发了一些工具和库,其中之一就是vcrpyvcrpy是一个用于优化HTTP请求的强大工具,它可以捕获、回放和存储HTTP请求和响应,以提高测试效率和降低对外部服务的依赖。本文将详细介绍vcrpy的功能和用法,并提供丰富的示例代码来帮助大家深入了解它。


安装和导入vcrpy

要开始使用vcrpy,首先需要安装它。

可以使用pip进行安装:

pip install vcrpy

安装完成后,可以在Python中导入vcr模块:

import vcr

基本用法

vcrpy的基本思想是将HTTP请求和响应记录到磁盘上的“磁带”文件中,以便在以后的测试中回放。

以下是一个简单的示例,演示了如何使用vcrpy记录和回放HTTP请求:

import requests
import vcr

# 创建一个VCR对象来管理记录和回放
with vcr.use_cassette('example_cassette.yml'):
    # 发送HTTP请求,并将响应存储到磁带中
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())
    
# 在以后的测试中,可以回放磁带中的HTTP请求,而不必访问网络

在这个示例中,首先创建了一个VCR对象,然后使用with语句将HTTP请求和响应记录到名为example_cassette.yml的磁带文件中。在以后的测试中,可以回放这个磁带中的HTTP请求,而不必访问网络,从而提高测试的效率和稳定性。

高级用法

除了基本用法外,vcrpy还提供了一些高级功能,如过滤器、请求匹配和自定义存储等。

1. 过滤器

vcrpy可以定义一些过滤器,以过滤HTTP请求中的敏感信息,如API密钥或个人令牌。

以下是一个示例,演示了如何使用过滤器来屏蔽HTTP请求中的敏感信息:

import requests
import vcr

# 创建一个自定义过滤器,将所有请求中的"Authorization"头字段替换为"FILTERED"
def custom_filter(r):
    r.headers['Authorization'] = 'FILTERED'
    return r

with vcr.use_cassette('filtered_cassette.yml', before_record_response=custom_filter):
    response = requests.get('https://api.example.com/resource', headers={'Authorization': 'Bearer my-secret-token'})
    print(response.json())

在这个示例中,创建了一个名为custom_filter的自定义过滤器,它会将HTTP请求中的Authorization头字段替换为FILTERED,从而隐藏了敏感信息。

2. 请求匹配

vcrpy可以定义请求匹配规则,以便在回放时选择正确的磁带。这对于处理多个相似的HTTP请求非常有用。

以下是一个示例,演示了如何使用请求匹配规则:

import requests
import vcr

# 创建一个请求匹配规则,仅匹配GET请求,并且URL中包含"/posts/"
my_matcher = vcr.matchers.RequestMatcher(method='GET', uri='/posts/')

with vcr.use_cassette('matcher_cassette.yml', match_on=[my_matcher]):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

在这个示例中,创建了一个自定义的请求匹配规则my_matcher,它会匹配所有GET请求,且URL中包含"/posts/"的请求。这样,只有符合匹配规则的请求才会从磁带中回放。

3. 自定义存储

vcrpy可以自定义存储后端,以便将HTTP请求和响应记录到不同类型的存储中,如数据库或云存储。

以下是一个示例,演示了如何使用自定义存储后端:

import requests
import vcr

class MyCustomStorage(vcr.storages.BaseStorage):
    def store(self, cassette):
        # 在这里自定义存储逻辑
        pass

    def load(self):
        # 在这里自定义加载逻辑
        pass

# 创建一个VCR对象,指定自定义存储后端
my_storage = MyCustomStorage()
with vcr.use_cassette('custom_storage_cassette.yml', storage=my_storage):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

在这个示例中,创建了一个名为MyCustomStorage的自定义存储后端,并将其传递给VCR对象。这允许你完全控制HTTP请求和响应的存储和加载过程。

实际应用场景

当使用vcrpy时,它可以在各种实际应用场景中发挥作用。以下是一些具体的示例代码,演示了如何在这些场景中使用vcrpy

1. 单元测试

在编写单元测试时,vcrpy可以模拟外部服务的响应,以确保代码在不同情况下都能正常工作。

以下是一个示例,演示了如何在Python的unittest框架中使用vcrpy进行单元测试:

import unittest
import vcr
import requests

class MyTestCase(unittest.TestCase):

    @vcr.use_cassette('test_data.yml')
    def test_api_request(self):
        response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
        self.assertEqual(response.status_code, 200)

if __name__ == '__main__':
    unittest.main()

在这个示例中,使用vcr.use_cassette装饰器来记录和回放HTTP请求,以模拟对外部API的请求。这样,可以在单元测试中使用真实的HTTP请求,同时也可以保持测试的稳定性和可重复性。

2. 集成测试

在执行集成测试时,vcrpy可以验证的应用程序与外部服务的交互是否正常。

以下是一个示例,演示了如何在集成测试中使用vcrpy

import pytest
import vcr
import requests

@pytest.fixture
def vcr_cassette():
    with vcr.use_cassette('integration_test.yml'):
        yield

def test_integration_with_external_api(vcr_cassette):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    assert response.status_code == 200

在这个示例中,使用pytest和pytest-vcr插件来执行集成测试。vcr_cassette是一个测试fixture,它使用vcr.use_cassette来记录和回放HTTP请求。这样,可以在集成测试中模拟对外部服务的交互,以验证应用程序的行为。

3. API开发

当开发和测试API时,vcrpy可以用于记录和回放API请求,以便更轻松地调试和验证API的行为。

以下是一个示例,演示了如何在Flask应用中使用vcrpy进行API开发和测试:

import vcr
from flask import Flask, jsonify
import requests

app = Flask(__name__)

@app.route('/api/posts/<int:post_id>')
@vcr.use_cassette('api_test.yml')
def get_post(post_id):
    response = requests.get(f'https://jsonplaceholder.typicode.com/posts/{post_id}')
    return jsonify(response.json())

if __name__ == '__main__':
    app.run()

在这个示例中,创建了一个简单的Flask API,它根据post_id参数获取外部API的数据。使用vcr.use_cassette来记录和回放API请求,以便在开发和测试过程中重复使用已记录的数据。

4. 数据抓取

在进行数据抓取时,vcrpy可以缓存和重复使用已下载的数据,以减少网络请求和提高效率。

以下是一个示例,演示了如何使用vcrpy进行数据抓取:

import vcr
import requests

def fetch_data():
    with vcr.use_cassette('data_caching.yml'):
        response = requests.get('https://api.example.com/data')
        return response.json()

data = fetch_data()  # 第一次请求,数据被缓存到磁带中

# 在以后的请求中,数据将被从缓存中回放,而不必再次访问外部API

在这个示例中,定义了一个fetch_data函数,它使用vcr.use_cassette来记录和回放数据抓取请求。第一次调用fetch_data时,数据被下载并缓存到磁带中。在以后的请求中,数据将从缓存中回放,而不必再次访问外部API,从而提高了数据抓取的效率。

总结

vcrpy是一个强大的Python工具,用于优化HTTP请求。它可以捕获、回放和存储HTTP请求和响应,以提高测试效率和降低对外部服务的依赖。通过本文的介绍和示例代码,应该已经对vcrpy的功能和用法有了深入的了解,可以开始在自己的项目中使用它,以提高HTTP请求的效率和可靠性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ 的基本概念

一 MQ 的基本概念 1 MQ概述 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的&#xff0c;解决的是通信问…

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

基于EEMD-SpEn(样本熵)联合小波阈值去噪

代码原理 以样本熵为阈值的EEMD联合小波阈值去噪方法是一种结合了经验模态分解&#xff08;EEMD&#xff09;、样本熵和小波阈值去噪的信号处理方法&#xff0c;用于去除信号中的噪声。 下面是具体的步骤&#xff1a; 1. 经验模态分解&#xff08;EEMD&#xff09;&#xff…

uniapp 开发小程序的时候使用自定义 tabbar 时出现切换页面闪烁的情况

问题&#xff1a;在使用自定义组件的时候可以看到页面切换明显的闪烁, 这种体验是很不好的, 当然最好的方式就是使用原生导航栏, 不要搞花里胡哨的东西。 来看下体验不好的效果 优化调整 先说思路&#xff0c;就是仍然设置原生 tabbar, 在应用启动的时候主动隐藏原生 tabba…

计算机网络 —— 数据链路层

数据链路层 3.1 数据链路层概述 数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。数据链路层使用的信道主要由以下两种类型&#xff1a; 点对点通信。广播通信。 数据链路和帧 链路&…

国足2024亚洲杯首战!Python爬取每场比赛双方球队的近期交战战绩

一、爬取目标 二、完整源码 #""""""""""""""""""""""""""""""""""""""…

30 树的定义

树的定义 树的度&#xff1f;叶节点&#xff1f; 注意&#xff1a;k为叶节点 孩子/双亲/子孙/祖先 树的高度&#xff1f; 有序树 森林 树的一些操作&#xff1a; 粗略的框架代码&#xff1a; 省略。。。 小结&#xff1a; 树是线性表的扩展

vcruntime140.dll已加载,但找不到入口点的处理方法分享

当遇到错误提示“vcruntime140.dll已加载&#xff0c;但找不到入口点”时&#xff0c;很多人可能会感到困惑&#xff0c;不知道如何去处理这个问题。不过没有必要紧张&#xff0c;在这里我会为大家详细解释 vcruntime140.dll 文件是什么&#xff0c;并指导大家如何高效地解决 v…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2105服务器场景操作系统&#xff1a;Windows&#xff08;版本不详&#xff09;&#xff08;封闭靶机&#xff09;需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…

让网页自动化测试更简便,流程图设计工具为您解决痛点

在数字化时代&#xff0c;网页自动化测试已经成为提高工作效率、保证项目质量的重要手段。然而&#xff0c;传统的自动化测试往往需要复杂的编程技能&#xff0c;对非专业人员来说门槛较高。为了解决这个问题&#xff0c;我们向您推荐一款创新的设计工具&#xff0c;它可以通过…

好大夫问诊数据爬虫记录

好大夫问诊数据爬虫入库字段记录 获取医生的病程列表 uid Column(Integer, primary_keyTrue, autoincrementTrue) gender Column(String(10)) # 性别 age Column(Integer) # 年龄 # 总交流次数 total_communication_times Column(Integer) # 医生回复次数 doctor_reply_t…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…

解密威胁:.kat6.l6st6r 勒索病毒的威胁与恢复

导言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已经成为网络安全威胁中的一大巨头。其中&#xff0c;.kat6.l6st6r 勒索病毒以其狡猾的传播方式和高级的加密算法备受关注。本文将深入介绍.kat6.l6st6r 勒索病毒的特点、应对措施以及如何预防此类威胁。如果您在面对被…

国内镜像:极速下载编译WebRTC源码(For Android/Linux/IOS)(二十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

视频剪辑达人分享:批量减片时时长并调整播放倍速的技巧

在视频剪辑中&#xff0c;经常要对多个视频片段进行时长调整和播放倍速的修改。如果一个个手动操作&#xff0c;不仅效率低下&#xff0c;还容易出错。如何快速批量处理这些片段呢&#xff1f;现在一起来看看云炫AI智剪批量减片时长并调整播放的具体步骤。 原视频和剪辑后的视…

HarmonyOS@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数…

从DETR到Mask2Former(1):DETR-segmentation结构全解析

网上关于DETR做的detection的解析很多&#xff0c;但是DETR做Segmentation的几乎没有&#xff0c;本文结合DETR的论文与代码&#xff0c;对DETR做一个详细的拆解。理解DETR是理解Mask2Former的基础。 首先得把DETR-segmentation给run起来。Github上DETR的repository&#xff0…

Ubuntu下AI4Green开源ELN服务的简单部署

主部署程序&#xff1a;AI4Green 配置参考这篇文档&#xff1a;AI4Green开源ELN&#xff08;电子实验记录本&#xff09;-CSDN博客 流量转发和负载均衡&#xff1a;使用Nginx 配置参考这篇文档&#xff1a;Nginx负载均衡-CSDN博客 SSL配置部分参考这篇文档&#xff1a; 设置…

案例119:基于微信小程序的宿舍管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

[NSSCTF Round#16 Basic] CPR

打着玩玩&#xff0c;比赛很简单。 Crypto pr 一个RSA题&#xff0c;n1p*q,n2q*r给了两个c和p,r而且flag经过pad用单因子无法解出。分别用p,r解完再取crt from Crypto.Util.number import * import randomflagplaintext NSSCTF{****************} charset abcdefghijklmn…