You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用python-twitter结合vcrpy录制API请求未生成cassette文件的问题

解决python-twitter与vcrpy无法生成cassette文件的问题

当然可以实现!我来帮你排查下问题所在,从几个关键方向逐一解决:

1. 避免VCRTestCase与装饰器的冲突

你继承了VCRTestCase,这个类本身已经内置了vcr的录制/回放功能,不需要再额外添加@vcr.use_cassette()装饰器。双重配置很容易导致冲突,反而让vcr无法正常生成cassette文件。

修改测试代码,去掉多余的装饰器:

from vcr_unittest import VCRTestCase
import twitter
from django.conf import settings

class TwitterRetrievalAndStorageTests(VCRTestCase):
    def test_recorded_session(self):
        api = twitter.Api(
            consumer_key=settings.TWITTER_CONSUMER_KEY,
            consumer_secret=settings.TWITTER_CONSUMER_SECRET,
            access_token_key=settings.TWITTER_ACCESS_KEY,
            access_token_secret=settings.TWITTER_ACCESS_SECRET
        )
        statuses = api.GetUserTimeline(screen_name='nntaleb')
        for s in statuses:
            print(s)

2. 确认cassette存储目录存在

VCRTestCase默认会把cassette文件放在测试文件同级的fixtures/vcr_cassettes/目录下。如果这个目录不存在,vcr没有权限自动创建的话,就无法写入文件。你可以手动创建这个目录,或者自定义存储路径:

import os
from vcr_unittest import VCRTestCase

class TwitterRetrievalAndStorageTests(VCRTestCase):
    def get_vcr_cassette_dir(self):
        # 自定义cassette存放目录,比如tests/cassettes/
        return os.path.join(os.path.dirname(__file__), 'cassettes')
    
    def test_recorded_session(self):
        # ... 测试代码 ...

3. 确保vcr能拦截python-twitter的requests调用

python-twitter确实依赖requests发起请求,但偶尔会因为虚拟环境隔离、依赖版本不一致等问题,导致vcr的猴子补丁没覆盖到python-twitter内部的requests实例。你可以做两步验证:

  • 先写个简单的手动请求测试,确认vcr基础功能正常:
def test_manual_request(self):
    import requests
    requests.get("https://httpbin.org/get")

如果这个请求能生成cassette,说明vcr没问题。此时可以在测试开头强制注入vcr的拦截逻辑:

import vcr
# 强制让vcr拦截requests的所有调用
vcr.patcher.inject('requests', vcr.stubs.VCRHTTPConnection, vcr.stubs.VCRHTTPSConnection)

4. 调整vcr的记录模式

vcr默认的记录模式是once——如果已有同名cassette文件,会直接复用而不重新生成。你可以改成new_episodes(新增请求会追加到cassette)或者all(每次都重新录制):

class TwitterRetrievalAndStorageTests(VCRTestCase):
    def get_vcr(self):
        vcr_instance = super().get_vcr()
        vcr_instance.record_mode = 'new_episodes'
        return vcr_instance
    
    # ... 测试方法 ...

按照上面的步骤调整后,应该就能正常生成cassette文件了。

内容的提问来源于stack exchange,提问作者Dimitrios Mistriotis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:47:58