Django-Simple-Captcha不生效,验证码错误时仍可成功提交帖子如何解决?
问题根源
你当前的视图代码存在逻辑分离问题,直接导致验证码校验完全不生效:
- 代码对POST请求做了两次独立判断,验证码校验逻辑和表单提交逻辑没有关联,即使验证码校验失败,后续的表单保存流程依然会正常执行
- 验证码校验通过后设置的
human变量没有被任何逻辑引用,没有作为表单保存的前置校验条件 - 非POST请求的else分支存在对
captcha变量的重复赋值,属于冗余代码
修复后的代码
将两次POST判断合并,把验证码校验作为表单提交的前置条件即可:
def discussions(request): posts = Post.objects.filter(created__lte=timezone.now()).order_by('-created') if request.method == 'POST': captcha = CaptchaTestModelForm(request.POST) form = PostForm(request.POST, request.FILES) # 同时校验验证码和表单有效性,验证码通过才允许保存帖子 if captcha.is_valid() and form.is_valid(): post = form.save(commit=False) post.created = timezone.now() post.save() return redirect('discussions') else: captcha = CaptchaTestModelForm() form = PostForm() # 请补充你原本的模板渲染逻辑,确保两个表单对象都传入模板上下文 return render(request, '你对应的模板路径.html', { 'posts': posts, 'captcha': captcha, 'form': form })
额外注意事项
- 确认模板中验证码字段和帖子提交的其它字段都在同一个
<form>标签内,否则POST请求不会携带验证码参数,会导致校验永远失败 - 可以在校验失败后给前端返回验证码错误的提示,引导用户重新填写
内容的提问来源于stack exchange,提问作者Kalo
相关产品推荐
相关产品推荐

