2010-09-27 7 views
0

Je voulais créer un validateur de format de fichier IDN à utiliser dans l'un de mes projets. J'ai utilisé une partie du code du projet Django (http://code.djangoproject.com/svn/django/trunk/django/core/validators.py) pour le faire, mais il doit y avoir une erreur triviale dans mon code I ne peut pas trouver:Erreur lors de la validation du validateur de courrier électronique

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 

Lorsque je tente de valider un e-mail avec un domaine IDN (ex: [email protected]ääl.de), l'exception non valide soulevée par le premier appel est lancé, et la partie du code après le premier sauf n'est jamais exécuté ('heywo!' n'est jamais imprimé).

Il est un exemple:

>>> 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) 

Qu'est-ce que je fait de mal?

Merci.

+0

S'il vous plaît modifier le message et inclure la trace de pile que vous obtenez avec l'erreur. – Daenyth

+0

J'ai ajouté la trace. Comme je l'ai dit, c'est juste le résultat auquel je m'attendrais en appelant le validateur _original_ Email. Ce qui n'est pas le cas:/ – Pierre

+0

Je regarderais la ligne 1352 dans validators.py comme les rapports de trace. Je soupçonne que quiconque a fait ce module ne gère pas correctement les portions de domaine Unicode. Je ne suis pas tout à fait sûr qu'ils sont valides pour commencer, mais ils pourraient facilement être (je n'ai pas assez de connaissances). Est-ce qu'il valide quand vous supprimez l'Unicode? – Daenyth

Répondre

0

D'accord, trouvé la réponse. Je surchargeais _to_python au lieu de validate_python. La classe ressemble maintenant:

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 

Il fonctionne parfaitement :)

+0

Vous devriez changer les lignes 'raise e' pour simplement' raise'. Si vous le faites, il conservera la trace de la pile au lieu de la réécrire. – Daenyth

+0

Je vais le faire. Merci. – Pierre

Questions connexes