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

如何在匿名用户完成验证码验证前持续重定向至验证页面

实现匿名用户验证码强制验证拦截

要让匿名用户必须完成验证码验证才能访问指定页面(如首页),核心是用Session标记验证状态,结合django-simple-captcha完成验证码校验,具体实现步骤如下:

核心逻辑

  1. 匿名用户无关联数据库模型,用request.session存储验证状态(如is_human: True)
  2. 验证码页面处理表单提交,验证通过后写入Session标记
  3. 所有需要拦截的视图先检查Session标记,未验证则重定向到验证码页面

1. 修正表单文件(forms.py)

无需多余的save方法,django-simple-captcha会自动处理验证码校验:

from django import forms
from captcha.fields import CaptchaField

class ConfirmationForm(forms.Form):
    captcha = CaptchaField(label="请输入验证码")

2. 修正路由配置(urls.py)

避免路由冲突,给验证码页面单独设置路径:

from django.urls import path
from home.views import confirmation_view, home_view

urlpatterns = [
    path('', home_view, name='home'),          # 首页设为默认路径
    path('verify/', confirmation_view, name='confirmation'),  # 验证码页面路径
]

3. 核心视图逻辑(views.py)

处理验证码校验、Session标记和重定向:

from django.shortcuts import render, redirect
from .forms import ConfirmationForm

def confirmation_view(request):
    if request.method == 'POST':
        form = ConfirmationForm(request.POST)
        # django-simple-captcha自动校验验证码是否正确
        if form.is_valid():
            # 验证通过,写入Session标记
            request.session['is_human'] = True
            # 跳转到首页(可优化为跳转到用户原本访问的页面)
            return redirect('home')
        # 验证失败,重新渲染表单(自动显示错误提示)
    else:
        form = ConfirmationForm()
    
    return render(request, 'base/confirmation.html', {'form': form})

def home_view(request):
    # 检查Session中的验证标记,未验证则重定向到验证码页面
    if not request.session.get('is_human', False):
        return redirect('confirmation')
    
    # 首页正常业务逻辑
    context = {
        # 填充首页所需数据
    }
    return render(request, 'base/home.html', context)

4. 验证码模板(confirmation.html)

修正转义字符,优化表单显示:

{% extends 'base/base.html' %}
{% block content %}
<div class="content">
    <h2 class="title">请完成验证码验证</h2>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <div>
            <button type="submit">验证并进入首页</button>
        </div>
    </form>
</div>
{% endblock %}

额外优化:跳转回原访问页面

如果用户直接访问某个受保护的页面(如/article/1/),可以先保存原路径,验证通过后跳转回去:

  1. 在受保护视图中保存原路径:
def article_detail(request, pk):
    if not request.session.get('is_human', False):
        # 保存当前访问路径到Session
        request.session['next_url'] = request.get_full_path()
        return redirect('confirmation')
    # 文章详情逻辑
  1. 在验证码视图中读取并跳转:
def confirmation_view(request):
    if request.method == 'POST':
        form = ConfirmationForm(request.POST)
        if form.is_valid():
            request.session['is_human'] = True
            # 读取原路径,无则跳首页
            next_url = request.session.pop('next_url', 'home')
            return redirect(next_url)
    # 其他逻辑

注意事项

  • 确保Django的Session中间件已启用(默认在settings.py的MIDDLEWARE中包含django.contrib.sessions.middleware.SessionMiddleware)
  • Session默认随浏览器关闭失效,若需持久化可配置Session过期时间
  • 验证码错误时,表单会自动显示错误提示,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:15:18