Development #38130
UnicodeEncodeError at /dpark/parking/link/
0%
Description
(à priori) Problème pour afficher le message d'erreur retourné par DPark.
Exception Type: UnicodeEncodeError Exception Value: 'ascii' codec can't encode character u'\xe9' in position 47: ordinal not in range(128) Exception Location: /usr/lib/python2.7/dist-packages/passerelle/contrib/dpark/models.py in call, line 205 args : (<WSGIRequest: POST '/dpark/parking/link/?orig=demarches-montoulouse.eservices.toulouse-metropole.fr&algo=sha256×tamp=2019-12-02T13%3A12%3A58Z&nonce=5fd51e97dd1566faf252dc13427f8278&signature=QWIxYrfc3anm/17kfE2ur%2BCkqJIdlEzqawQIEVpiPyE%3D'>,) e : UnicodeEncodeError('ascii', u"La valeur 'E-6-VMQN504M' ne respecte pas le sch\xe9ma XSD.", 47, 48, 'ordinal not in range(128)') extras : {'body': '\'{"lastname": "LANNELONGUE", "cardnumber": "", "firstnames": "VINCENT", "badgenumber": "", "filenumber": "E-6-VMQN504M", "nameid": "8da5dc154c544647ba33cc9d84db88b7"}\'', 'exception': u"'ascii' codec can't encode character u'\\xe9' in position 47: ordinal not in range(128)",
Avec un peu de chance c'est déjà résolu par #37880
Fichiers
Révisions associées
Historique
Mis à jour par Thomas Noël il y a plus de 4 ans
L'erreur se produit ligne 205 :
198 def call(self, operation, *args, **kwargs): 199 client = get_client(self) 200 proxy_service = client.create_service(SERVICE_BINDING, self.operation_url) 201 bypass_erroneous_reply = kwargs.pop('bypass_erroneous_reply', False) 202 try: 203 reply = getattr(proxy_service, operation)(*args, **kwargs) 204 except (WebFault, ) as exc: 205 raise APIError('ServiceError: %s' % exc.message) 206 except (Exception,) as exc: 207 raise APIError('Error: %s' % exc.message) 208 reply_code = getattr(reply, 'CodeRetour', None) or getattr(reply, 'Code_Retour', None) 209 reply_message = getattr(reply, 'MessageRetour', None) or getattr(reply, 'Lib_Retour', None) 210 if reply_code != '01' and not bypass_erroneous_reply: 211 raise APIError(reply_message) 212 return reply
C'est DPark qui n'est pas content et renvoie le message avec un encodage latin1. Il faudrait peut-être passer à %r sur les exc.message.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
force_text(exc.message , 'latin1', error='ignore')
Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans
- Fichier 0001-dpark-accept-error-message-containing-latin1-38130.patch 0001-dpark-accept-error-message-containing-latin1-38130.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
- si dans le test je met "éêè" à la place de u"éêè", je n'ai plus l'erreur
- et si je met u"éêè".encode('latin_1'), alors j'ai DjangoUnicodeDecodeError au décodage
Néanmoins, je pense avoir réussi à reproduire l'erreur de la trace.
Mis à jour par Thomas Noël il y a environ 4 ans
(je suis perdu dans la compréhension du code et du test, l'encodage et moi... je passe la main)
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution proposée à En cours
Thomas Noël a écrit :
(je suis perdu dans la compréhension du code et du test, l'encodage et moi... je passe la main)
En fait c'est ton analyse initiale qui est mauvaise, il n'y a pas de latin1 ici, zeep décode bien le message et en fait de l'unicode, c'est juste qu'on fait un
'%s' % excet Exception ne gère pas ça :
>>> str(Exception(u'é')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128)
Un simple
% exc.messagesuffira.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Fichier 0001-dpark-use-only-unicode-strings-38130.patch 0001-dpark-use-only-unicode-strings-38130.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de En cours à Solution proposée
Voilà on passe tout en unicode et ça marche mieux (en entrée on a que de l'unicode et en sortie aussi via zeep), et afficher une exception avec de l'unicode dans une chaîne unicode ça marche par contre.
Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a environ 4 ans
Je ne connaissais pas https://python-future.org/unicode_literals.html
ça fait le job, et ça corrige mon oubli sur la seconde exception.
Pour moi c'est bon, mais je laisse la main.
Mis à jour par Thomas Noël il y a environ 4 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 19694e1a47ee1082876cc37b5e400bd05309a3f5 Author: Nicolas ROCHE <nroche@entrouvert.com> Date: Thu Dec 19 15:57:27 2019 +0100 dpark: use only unicode strings (#38130)
Mis à jour par Frédéric Péters il y a environ 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
dpark: use only unicode strings (#38130)