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

如何在自定义登录页集成django-two-factor-auth并自定义相关验证页面

普通用户双因子登录逻辑适配

你需要修改现有登录视图,在用户名密码验证通过后先判断用户是否开启了双因子认证,再走对应逻辑:

  • 若用户未开启双因子:直接执行登录跳转
  • 若用户已开启双因子:暂不执行全局登录,将用户临时信息存入session后跳转OTP校验页

修改后的login_view代码如下:

from django.shortcuts import redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages

def login_view(request):
    if request.user.is_authenticated:
        return redirect('blog:my-account')
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            # 判断用户是否开启双因子认证
            if user.totpdevice_set.filter(confirmed=True).exists():
                # 将验证通过的用户ID存入session,供OTP校验页使用
                request.session['pre_otp_user_id'] = user.id
                # 跳转OTP验证页,url名称对应django-two-factor-auth的校验路由
                return redirect('two_factor:login_token')
            else:
                # 未开启双因子直接登录
                login(request, user)
                messages.add_message(request, messages.INFO, 'Login Sucessfull')
                return redirect('members:user-profile-private')
    # 原有GET请求的登录页渲染逻辑保持不变即可

注意:你需要确保django-two-factor-auth的OTP校验路由已经在urls.py中正确配置

urls.py配置示例:

from django.urls import path, include
from . import views

urlpatterns = [
    path('login/', views.login_view, name='login'),
    # 引入django-two-factor-auth的路由,用于OTP校验
    path('two-factor/', include('two_factor.urls', 'two_factor')),
    # 其他路由保持不变
]
常见问题解答

1. 恢复Django默认后台登录页

django-two-factor-auth默认会覆盖Django admin的登录路由,只需要调整路由加载顺序即可解决:

  • 将path('admin/', admin.site.urls)的配置放到所有django-two-factor-auth相关路由的前面,Django路由按从上到下的优先级匹配,先匹配到admin原生路由就不会走双因子的覆盖路由
  • 如果需要保留管理员账号必须走OTP校验的要求,可以单独给admin后台添加校验中间件,判断管理员用户是否完成双因子验证即可,不需要依赖默认的登录页覆盖逻辑

2. 自定义双因子认证登录HTML页面

完全支持自定义页面,django-two-factor-auth的所有模板都可以通过项目模板覆盖的方式修改:

  1. 在你项目的templates目录下新建two_factor文件夹
  2. 从django-two-factor-auth的源码template目录中复制你需要修改的模板文件(比如登录页core/login.html、OTP校验页core/login_token.html等)到刚才新建的two_factor目录下
  3. 直接修改复制后的模板文件的样式、结构即可,Django会优先加载你项目下的模板文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:45:04