能否通过设置禁用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
相关产品推荐
相关产品推荐

