如何在匿名用户完成验证码验证前持续重定向至验证页面
实现匿名用户验证码强制验证拦截
要让匿名用户必须完成验证码验证才能访问指定页面(如首页),核心是用Session标记验证状态,结合django-simple-captcha完成验证码校验,具体实现步骤如下:
核心逻辑
- 匿名用户无关联数据库模型,用
request.session存储验证状态(如is_human: True) - 验证码页面处理表单提交,验证通过后写入Session标记
- 所有需要拦截的视图先检查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/),可以先保存原路径,验证通过后跳转回去:
- 在受保护视图中保存原路径:
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') # 文章详情逻辑
- 在验证码视图中读取并跳转:
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
相关产品推荐
相关产品推荐

