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

能否通过设置禁用Django双因素认证?如何为其保护的网站编写LiveServerTestCase?

1. 是否可以通过设置项禁用Django双因素认证?

当然可以!市面上主流的Django双因素认证库(比如django-two-factor-auth、django-otp)都支持通过配置快速禁用,给你两种常用方案:

  • 全局粗暴禁用:直接从INSTALLED_APPS里移除双因素相关的app(比如'two_factor'),同时把对应的中间件(比如'two_factor.middleware.threadlocals.ThreadLocals')从MIDDLEWARE列表中删掉。
  • 优雅开关控制:在settings.py里添加库对应的开关参数,比如用django-two-factor-auth就加TWO_FACTOR_ENABLED = False,用django-otp就加OTP_ENABLED = False——这种方式不用动依赖列表,测试环境单独配置也很方便。

2. 针对受双因素保护的网站编写LiveServerTestCase的解决方案

我猜你是卡在自动化测试没法手动输入验证码这一步了吧?给你两套实用方案,按需选择:

方案一:测试环境全局跳过双因素(最快最省事)

直接在测试专用的配置文件(比如test_settings.py)里禁用双因素,这样测试流程完全不会触发验证步骤:

# test_settings.py
# 假设使用django-two-factor-auth
TWO_FACTOR_ENABLED = False
# 如果是django-otp,替换成OTP_ENABLED = False

方案二:给测试用户单独标记跳过双因素(保留双因素功能测试空间)

如果你的测试需要覆盖双因素场景,又不想影响登录流程,可以给测试用户添加“已验证双因素”的标记,以django-two-factor-auth为例修改你的测试代码:

import os
from urllib.parse import urljoin
from django.urls import reverse
from django.conf import settings
from lucy_web.test_factories import UserFactory
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from two_factor.models import PhoneDevice  # 导入双因素设备模型

class ProtectedSiteLiveTest(StaticLiveServerTestCase):
    def setUp(self):
        super().setUp()
        # 创建并配置测试用户
        self.user = UserFactory()
        self.user.set_password('testpass123')
        self.user.save()

        # 关键:给用户创建已确认的双因素设备,模拟已经完成验证
        PhoneDevice.objects.create(
            user=self.user,
            number='+1234567890',  # 随便填一个格式合法的号码就行
            confirmed=True  # 标记为已确认,跳过验证流程
        )

        # 初始化Chrome驱动
        chromedriver_path = os.path.join(os.path.dirname(os.path.dirname(settings.BASE_DIR)), 'chromedriver')
        self.driver = webdriver.Chrome(executable_path=chromedriver_path)
        self.driver.implicitly_wait(10)

    def test_login_without_2fa_block(self):
        # 访问登录页
        login_url = urljoin(self.live_server_url, reverse('login'))
        self.driver.get(login_url)

        # 输入用户名密码并提交
        self.driver.find_element_by_name('username').send_keys(self.user.username)
        self.driver.find_element_by_name('password').send_keys('testpass123')
        self.driver.find_element_by_xpath('//button[@type="submit"]').click()

        # 断言登录后跳转到首页(不会被双因素页面拦截)
        self.assertEqual(self.driver.current_url, urljoin(self.live_server_url, reverse('home')))

    def tearDown(self):
        self.driver.quit()
        super().tearDown()

如果用的是其他双因素库,核心逻辑都是一样的:给测试用户标记为“已完成双因素验证”,让认证流程直接跳过验证步骤。

内容的提问来源于stack exchange,提问作者Kurt Peek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:02