Python Web开发库之vcrpy 使用详解


概要

在现代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请求的效率和可靠性。

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

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

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

相关文章

软件分发点(DP)的合理规划

软件分发点&#xff08;Distribution Point, DP&#xff09;是用于托管文件以分发到计算机和移动设的服务器&#xff0c;Jamf Pro可以通过分发点分发以下类型的文件&#xff1a; 软件包 脚本 内部应用程序 内部书籍 Jamf Pro支持两种类型的分发点&#xff0c;您可以使用这些类型…

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

为感谢用户对Solmash的支持&#xff0c;Solmash特别推出“Solmash早鸟激励计划”&#xff0c;以回馈社区的早期参与者&#xff0c;这是专为已经参与Staking Pool或Honest Pool的用户推出的激励。 Solmash NFT激励 为确保该NFT的精准发放&#xff0c;请在Jan 11th, 2024 12:00 U…

react hooks 高德地图的应用

一、准备 1.登录控制台 登录 高德开放平台控制台&#xff0c;如果没有开发者账号&#xff0c;请 注册开发者。 2.创建 key 进入应用管理&#xff0c;创建新应用&#xff0c;新应用中添加 key&#xff0c;服务平台选择 Web端(JS API)。 3.获取 key 和密钥 创建成功后&#x…

无监督学习Principal Component Analysis(PCA)精简高维数据

目录 介绍 一、PCA之前 二、PCA之后 介绍 Principal Component Analysis (PCA) 是一种常用的数据降维和特征提取技术。PCA通过线性变换将高维数据映射到低维空间&#xff0c;从而得到数据的主要特征。PCA的目标是找到一个正交基的集合&#xff0c;使得将数据投影到这些基…

git提交记录全部删除

目录 问题描述 解决方案 结果 问题描述 新复制的项目具有特比多的提交记录我想给他清除&#xff0c;因为不清楚过多历史也就导致包特别大下载和提交等方面都不是很快 解决方案 查看代码clone网址&#xff1b; 打开远程仓库&#xff0c;选择要去除历史记代码分支&#xff08…

CSS3 边框border、outline、box-shadow

1 border 语法&#xff1a;border: width style color 2 outline 语法&#xff1a;outline: width style color 2.1 outline-offet MDN解释&#xff1a;用于设置outline与一个元素边缘或边框之间的间隙 即&#xff1a;设置outline相对border外边缘的偏移&#xff0c;可以为…

1.5计算机网络的分类

1.5计算机网络的分类 1.5.1按照网络的作用范围进行分类 1、广域网WAN 广域网WAN&#xff08;WideAreaNetwork&#xff09;&#xff1a;广域网的作用范围通常为几十到几千公里&#xff0c;因而有时也称为远程网(longhaulnetwork)。广域网是互联网的核心部分&#xff0c;其任务…

架构02 - 架构的基础: 特点,本质...

软件架构简介&#xff1a; 架构是对系统中各个实体以及它们之间关系的抽象描述&#xff0c;是对功能和形式元素之间对应关系的分配&#xff0c;也是对元素之间关系及与周边环境关系的定义。软件架构的核心价值在于控制系统的复杂性&#xff0c;实现核心业务逻辑和技术细节的解耦…

CES 2024丨引领变革,美格智能为智能终端带来生成式AI能力

作为电子行业的“风向标”&#xff0c;CES 2024&#xff08;国际消费电子展&#xff09;于1月9日至12日在美国拉斯维加斯举办。本届展会可谓是AI的盛宴&#xff0c;芯片、AI PC、智能家居、汽车科技、消费电子等领域与AI相关的前沿成果接连发布&#xff0c;引领人工智能领域的科…

Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

2024年最佳免费简历编辑工具,全功能完全免费使用!

随着科技的不断发展&#xff0c;求职竞争也愈发激烈。在2024年&#xff0c;如何在众多求职者中脱颖而出成为关键问题。为了帮助大家在职业生涯中取得更好的机会&#xff0c;特别推荐一款在2024年最为出色的免费简历编辑工具——芊芊简历。 1. 免费编辑功能 芊芊简历拥有直观易…

rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜

在中文环境下&#xff0c;多音字是比较常见的现象。对于一些不常见的生僻字&#xff0c;或者一些用于地名&#xff0c;人名中的常见字的冷门读音&#xff0c;如果不能正确的阅读&#xff0c;例如把 荥阳 读成了 miāo yng&#xff0c;则会怡笑大方。 今天我们在rime中州韵小狼…

Leetcode349两个数组的交集(java实现,思路超清晰想学会的进来!)

今天&#xff0c;博主分享的题目是leetcode上的349两个数组的交集。题目描述如下&#xff1a; 解题思路:在这里我们分享一个做题的小技巧&#xff0c;我们拿到题如果题目描述中有判断某个集合中有没有哪个元素&#xff0c;类似这种要求的我们首先应该考虑是否可以使用哈希表。…

探索 C# 中的程序运行目录获取方法

探索 C# 中的程序运行目录获取方法 引言 在 C# 开发中&#xff0c;有时需要确定您的应用程序的运行目录。这可能是为了读取配置文件、存储日志&#xff0c;或者访问与应用程序位于同一目录的其他资源。C# 提供了几种方法来获取当前程序的运行目录。本文将探讨这些方法及其使用…

【漏洞复现】天融信TOPSEC static_convert 远程命令执行

漏洞描述 天融信TOPSEC Static_Convert存在严重的远程命令执行漏洞。攻击者通过发送精心构造的恶意请求,利用了该漏洞,成功实现在目标系统上执行任意系统命令的攻击。成功利用漏洞的攻击者可在目标系统上执行恶意操作,可能导致数据泄露、系统瘫痪或远程控制。强烈建议立即更…

google关键词分析怎么做?

想分析关键词那自然是要使用工具&#xff0c;而分析一个关键词比较看重的有两点&#xff0c;搜索量以及竞争程度。 搜索量无非就是关键词在谷歌搜索引擎被搜索的次数&#xff0c;这个数量越大&#xff0c;就证明这个关键词被人搜的越多次&#xff0c;我们要做的词&#xff0c;肯…

水产冷链物流行业零下25℃库架一体 海格里斯HEGERLS四向穿梭式冷藏冷库智能密集仓

随着国内外仓储物流整体规模和低温产品消费需求的稳步增长&#xff0c;冷链市场应用潜力不断释放。在传统“货架叉车”的方式下&#xff0c;货物、人员及机械设备不断进出&#xff0c;容易造成温度波动&#xff0c;导致冷量流失。立体冷库则以更高密度、更具成本效益的方式&…

【C++进阶06】红黑树图文详解及C++模拟实现红黑树

一、红黑树的概念及性质 1.1 红黑树的概念 AVL树用平衡因子让树达到高度平衡 红黑树可以认为是AVL树的改良 通过给每个节点标记颜色让树接近平衡 以减少树在插入节点的旋转 在每个结点新增一个存储位表示结点颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上 各个结点…

go语言中的函数和方法

函数定义 1.1.1. golang函数特点&#xff1a; • 无需声明原型。• 支持不定 变参。• 支持多返回值。• 支持命名返回参数。 • 支持匿名函数和闭包。• 函数也是一种类型&#xff0c;一个函数可以赋值给变量。• 不支持 嵌套 (nested) 一个包不能有两个名字一样的函数。• 不…

PostgreSQL从小白到高手教程 - 第41讲:postgres表空间备份与恢复

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第41讲&#…