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

如何在Django单元测试中生成Cloudflare Turnstile令牌

在Django单元测试中生成Cloudflare Turnstile令牌的几种方法

方法一:测试环境直接绕过验证(推荐)

单元测试的核心是验证业务逻辑,没必要走真实的人机验证流程。可以在Turnstile的验证逻辑中加入判断,当处于测试环境时直接跳过验证:

# 示例:在你的Turnstile验证函数中添加测试环境判断
from django.conf import settings

def validate_turnstile_token(token):
    # 测试环境下直接返回验证通过
    if settings.TESTING:
        return True
    # 生产环境正常调用Cloudflare API进行验证
    # ... 原有验证逻辑代码

之后在测试的setUp里,token字段可以随便填一个值,甚至如果视图允许的话可以直接省略。

方法二:使用Cloudflare官方测试令牌或生成假令牌

Cloudflare提供了专门用于测试的令牌,无需真实生成:

  • 0x4AAAAAAAC3N4tYEAfxG4iU:始终验证通过
  • 0x4AAAAAAAC3N4tYEAfxG4iV:始终验证失败

如果需要每次测试用不同的令牌,可以写个简单函数生成符合Turnstile格式的随机字符串:

import random
import string

def generate_fake_turnstile_token():
    # 生成模仿Turnstile令牌格式的随机字符串
    part1 = '0.' + ''.join(random.choices(string.ascii_letters + string.digits + '-_', k=100))
    part2 = '.' + ''.join(random.choices(string.ascii_letters + string.digits + '-_', k=20))
    part3 = '.' + ''.join(random.choices(string.hexdigits, k=64))
    return part1 + part2 + part3

# 在测试类的setUp中使用
class TestSignupView(BaseTestCase):
    def setUp(self) -> None:
        super().setUp()
        self.view = SignupView.as_view()
        self.data = {
            "first_name": "test",
            "last_name": "user",
            "email": "testuser1@gmail.com",
            "password": "testpassword",
            "re_password": "testpassword",
            "company_name": "Testing Company",
            "token": generate_fake_turnstile_token()
        }

方法三:用Mock模拟验证结果

如果不想修改原有验证逻辑,可以用unittest.mock来模拟验证函数的返回值,这样token字段随便填都能通过:

from unittest.mock import patch
from rest_framework.test import APIClient

class TestSignupView(BaseTestCase):
    def setUp(self) -> None:
        super().setUp()
        self.client = APIClient()
        self.data = {
            "first_name": "test",
            "last_name": "user",
            "email": "testuser1@gmail.com",
            "password": "testpassword",
            "re_password": "testpassword",
            "company_name": "Testing Company",
            "token": "random-test-token"
        }
    
    @patch('signup.views.validate_turnstile_token')  # 替换成你实际的验证函数路径
    def test_signup_success(self, mock_validate):
        mock_validate.return_value = True  # 强制模拟验证通过
        response = self.client.post('/signup/', self.data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

内容的提问来源于stack exchange,提问作者Omnia Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:52:28