【问题标题】:Error when the Email formencode validator电子邮件formencode验证器时出错
【发布时间】:2010-09-27 23:46:54
【问题描述】:

我想创建一个可识别 IDN 的 formencode 验证器以在我的一个项目中使用。我使用了 Django 项目 (http://code.djangoproject.com/svn/django/trunk/django/core/validators.py) 中的一部分代码来做到这一点,但我的代码中肯定有一个小错误找不到:

class Email(formencode.validators.Email):
    def _to_python(self, value, state):
        try:
            return super(Email, self)._to_python(value, state)
        except formencode.Invalid as e:
            # Trivial case failed. Try for possible IDN domain-part

            print 'heywo !'

            if value and u'@' in value:
                parts = value.split(u'@')
                try:
                    parts[-1] = parts[-1].encode('idna')
                except UnicodeError:
                    raise e

                try:
                    super(Email, self)._to_python(u'@'.join(parts), state)
                except formencode.Invalid as ex:
                    raise ex

                return value
            else:
                raise e

当我尝试使用 IDN 域(例如:test@wääl.de)验证电子邮件时,第一次调用引发的 Invalid 异常被抛出,并且第一次 except 之后的代码部分永远不会执行('heywo !' 永远不会被打印出来)。

有一个例子:

>>> from test.lib.validators import Email
>>> Email().to_python(u'test@zääz.de')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/FormEncode-1.2.3dev-py2.6.egg/formencode    /api.py", line 416, in to_python
    vp(value, state)
  File "/usr/local/lib/python2.6/dist-packages/FormEncode-1.2.3dev-py2.6.egg/formencode    /validators.py", line 1352, in validate_python
    value, state)
Invalid: The domain portion of the email address is invalid (the portion after the @: z\xe4\xe4z.de)

我做错了什么?

谢谢。

【问题讨论】:

  • 请编辑帖子并包含您收到的错误堆栈跟踪。
  • 我添加了跟踪。正如我所说,这只是我通过调用 original 电子邮件验证器所期望的结果。事实并非如此:/
  • 我会查看 validators.py 中的第 1352 行作为跟踪报告。我怀疑制作该模块的人没有正确处理 unicode 域部分。我也不完全确定它们一开始就有效,但它们很容易成为(我没有足够的知识)。当你删除 unicode 时它会验证吗?
  • 第 1352 行基本上是引发formencode.Invalid 异常的地方。事实上,我的问题更像是:为什么在 my 代码中,外部 try/except 不起作用,为什么我不能捕捉到这个异常?

标签: python formencode


【解决方案1】:

好的,找到答案了。我重载了_to_python 而不是validate_python。该类现在看起来像:

class Email(formencode.validators.Email):
    def validate_python(self, value, state):
        try:
            super(Email, self).validate_python(value, state)
        except formencode.Invalid as e:
            # Trivial case failed. Try for possible IDN domain-part
            if value and u'@' in value:
                parts = value.split(u'@')
                try:
                    parts[-1] = parts[-1].encode('idna')
                except UnicodeError:
                    raise e

                try:
                    super(Email, self).validate_python(u'@'.join(parts), state)
                except formencode.Invalid as ex:
                    raise ex
            else:
                raise e

它工作得很好:)

【讨论】:

  • 您应该将raise e 行更改为raise。如果这样做,它将保留堆栈跟踪而不是重写它。
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 2015-11-22
  • 2020-04-10
  • 2018-10-23
  • 2017-10-12
  • 1970-01-01
  • 2018-05-26
  • 2018-08-26
相关资源
最近更新 更多