2010-09-27 4 views
0

Я хотел создать удостоверение идентификатора formencode, поддерживающее IDN, для использования в одном из моих проектов. Я использовал часть кода из проекта Django (http://code.djangoproject.com/svn/django/trunk/django/core/validators.py), но в моем коде I должна быть тривиальная ошибка не могу найти:Ошибка при проверке формы formencode электронной почты

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 (например: [email protected]ääl.de) недействительна исключения, сгенерированные первый вызов брошен, и часть кода после первое исключение никогда не выполняется («heywo!» никогда не печатается).

Существует пример:

>>> from test.lib.validators import Email 
>>> Email().to_python(u'[email protected]ää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) 

Что я сделал не так?

Спасибо.

+0

Пожалуйста, измените запись и включить трассировку стека вы получите с ошибкой. – Daenyth

+0

Я добавил след. Как я уже сказал, это результат, который я ожидаю, вызывая валидатор _original_ Email. Это не так:/ – Pierre

+0

Я бы посмотрел строку 1352 в validators.py как отчеты трассировки. Я подозреваю, что тот, кто сделал этот модуль, неправильно обрабатывает части домена юникода. Я также не совсем уверен, что они действительны для начала, но они могут быть легко (у меня недостаточно знаний). Проверяет ли он, когда вы удаляете юникод? – Daenyth

ответ

0

Хорошо, нашел ответ. Я перегружал _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 

Это отлично работает :)

+0

Вы должны изменить строки 'raise e' только для' raise'. Если вы это сделаете, он сохранит трассировку стека вместо того, чтобы переписать его. – Daenyth

+0

Я сделаю это. Благодарю. – Pierre

Смежные вопросы