Django简单验证码无法获取ValidationError异常

标签 django django-forms captcha

如何获取?

this教程中,它说如果用户没有对 CAPTCHA 质询提供有效响应,表单将引发 ValidationError:

我的表格

class AuthenticationForm(forms.Form):
    username = forms.CharField(label=_("Username"), max_length=30)
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
    captcha = CaptchaField(label=_("Captcha"))

我的观点

try:
    form = AuthenticationForm(request.POST)
    if form.is_valid():
        pass
except Exception, ex:
    LOG.debug("Captcha Error: %s" % str(ex))

我无法从表单中得到任何异常。如何实现呢?有什么想法吗?

更新1

我在验证码的源代码中的“clean”函数中放置了一些 subprocess.call(["logger", "-t", "blah", "blahblah"]) 语句,但是看起来它甚至没有进入clean。这也是唯一引发 ValidationError 的地方。

最佳答案

您没有在表单上调用 is_valid(),除非您这样做,否则不会引发验证错误。

我猜你想要这样的东西:

try:
    form = AuthenticationForm(request.POST)
    if form.is_valid():
        #Do something
except Exception, ex:
    #ValidationErrror will be caught here
    LOG.debug("Captcha Error: %s" % str(ex))

但是你仍然不会得到任何异常。原因:当你调用is_valid时,django内部使用名为full_clean的方法。如果任何字段引发 ValidationError,此方法会在内部捕获它并更新表单上名为 errors 的属性。因此,您的 View 永远不会收到表单字段引发的任何 ValidationError

了解是否引发 ValidationError 的方法是访问表单的 errors 属性。

所以,代码是

form = AuthenticationForm(request.POST)
if form.is_valid():
    pass
#In case of valid form next line will not be called because form.errors will be an empty dict
if form.errors and 'captcha' in form.errors:
    LOG.debug("Captcha Error:")  
    #also you can access exact error by form.errors['captcha']

关于Django简单验证码无法获取ValidationError异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142073/

相关文章:

防止机器人提交表单的 JavaScript 代码

asp.net-mvc-3 - 基于简单数学的验证码

基于 Django 类的 View - 过滤查询集并保存它

javascript - 我可以在 django 项目中使用 react router 吗?

django - 在 Django 中注册用户的最佳方式

json - django:表单到 json

django - 如何使用 form_valid 在基于类的 View 中加载实例

python - 在Django中间件修改地址

django - uwsgi + nginx + Django : ImportError: No module named django. core.wsgi

ruby-on-rails - gem-idea : Automatic spam protection with captcha in before_filter when HTTP-method is post, 放置或删除