Comment résoudre un UnicodeDecodeError?
Je reçois un étrange message d'erreur lorsque vous essayez de lire des caractères non ascii de la banque de données:
'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
Traceback (most recent call last):
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 127, in dispatch
response = super(NewBaseHandler, self).dispatch()
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 73, in check_login
return handler(self, *args, **kwargs)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 526, in get
user=user)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 91, in render_jinja
**template_args))
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2_extras/jinja2.py", line 158, in render_template
return self.environment.get_template(_filename).render(**context)
File "/base/data/home/apps/s~myapp-www/events.355951895377615944/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "template_files/my_organization.html", line 148, in top-level template code
<li id="{{ person.key.id()|makeid }}" class="level_1 inactive leaf"><a href="" style="" class=""><ins> </ins><table class="leaf_info"><tbody> <tr><td class="name">{{ person.firstname }} {{ person.lastname}} {{person.key.id()|makeid}}</td><td class="level" title="New Distributor"><span class="level_parseable">1</span>1</td><td class="downlines">0</td><td class="cc_personal"><span class="cc_personal_parseable"></span>0</td><td class="cc_downlines"><span class="cc_downlines_parseable"></span>0</td><td class="cc_activity"><span class="cc_activity_parseable"></span>0</td><td class="cc_nonmanager"><span class="cc_nonmanager_parseable"></span>0</td><td class="cc_total"><span class="cc_total_parseable"></span>0</td></tr></tbody></table></a></li>{% endfor %}
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
La boucle utilisé pour travailler est ordinaire:
{% for person in people %}
<li id="{{ person.key.id()|makeid }}" class="level_1 inactive leaf">
<a href="" style="" class=""><ins> </ins><table class="leaf_info"><tbody> <tr><td class="name">{{ person.firstname }} {{ person.lastname}} {{person.key.id()|makeid}}</td><td class="level" title="New Distributor"><span class="level_parseable">1</span>1</td><td class="downlines">0</td><td class="cc_personal"><span class="cc_personal_parseable"></span>0</td><td class="cc_downlines"><span class="cc_downlines_parseable"></span>0</td><td class="cc_activity"><span class="cc_activity_parseable"></span>0</td><td class="cc_nonmanager"><span class="cc_nonmanager_parseable"></span>0</td><td class="cc_total"><span class="cc_total_parseable"></span>0</td></tr></tbody></table></a></li>
{% endfor %}
Que puis-je faire pour résoudre cette erreur?
Mon gestionnaire ressemble à ceci
class Myorg(NewBaseHandler):
@user_required
def get(self):
user = auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id']))
people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch()
self.render_jinja('my_organization.html', people=people,
user=user)
Et ma définition du modèle est le modèle de l'Utilisateur à partir de webapp2. Voici également mon custom filer makeid:
def makeid(n, countrycode="46"):
countrycode = str(countrycode)
n = str(n)
return "%s%s%s" % (countrycode, '0'*(12-len(countrycode)-len(n)), n)
Mise à jour
La solution de contournement est étrange, je viens de faire un .decode('utf-8')
qui ne devrait pas être en train de faire:
class UpdateHandler(NewBaseHandler):
@user_required
def get(self):
user = \
auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id'
]))
sponsor = None
if user.sponsor:
sponsor = user.sponsor.get()
address = None
if user.address:
address = user.address.decode('utf-8')
if user.city:
city = user.city.decode('utf-8')
self.render_jinja('details.html', city=city, user=user, address=address, sponsor=sponsor, form=UpdateForm(obj=user))
Est-il possible de décoder l'ensemble des variables de l'objet utilisateur à la fois au lieu d'une par une?
Trouver les entrées de base de données contenant 0xC3, ou plus généralement de tous les caractères peu élevé; et/ou corriger le code pour accepter l'encodage que vous avez dans votre base de données. FWIW 0xC3 est à en Latin-1, si c'est ce que vous avez, ou ce pourrait être le premier caractère dans une UTF8 séquence.
Je peux dire que je n'ai probablement pas stockées Ã. Merci pour le commentaire, mais mon code doit gérer le format de la banque de données (google app engine) et il y a très peu de code, sauf pour le modèle. Depuis que l'erreur se produit uniquement sur la production, je conclus également qu'elle a quelque chose à voir avec ce qui est lu à partir de la banque de données c'est à dire le contenu de la liste nommée personnes et qui est passé plus ou moins directement à partir de la banque de données à l'aide d'une requête en python
Pouvez-vous montrer le
La définition du modèle est le modèle de l'Utilisateur à partir de webapp2 ie webapp-improved.appspot.com/api/webapp2_extras/appengine/auth/...
Pouvez-vous inclure votre filtre personnalisé "makeid" définition trop?
Je peux dire que je n'ai probablement pas stockées Ã. Merci pour le commentaire, mais mon code doit gérer le format de la banque de données (google app engine) et il y a très peu de code, sauf pour le modèle. Depuis que l'erreur se produit uniquement sur la production, je conclus également qu'elle a quelque chose à voir avec ce qui est lu à partir de la banque de données c'est à dire le contenu de la liste nommée personnes et qui est passé plus ou moins directement à partir de la banque de données à l'aide d'une requête en python
people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch()
Ce qui se passe si c'est une UTF8 séquence?Pouvez-vous montrer le
__unicode__
méthode de votre modèle? Je soupçonne une erreur là...La définition du modèle est le modèle de l'Utilisateur à partir de webapp2 ie webapp-improved.appspot.com/api/webapp2_extras/appengine/auth/...
Pouvez-vous inclure votre filtre personnalisé "makeid" définition trop?
OriginalL'auteur Niklas Rosencrantz | 2012-01-08
Vous devez vous connecter pour publier un commentaire.
Vous tentez d'interpoler une crue (byte) chaîne de caractères en Unicode modèle. Ceci est fait en essayant de décoder la chaîne brute en unicode à l'aide de certains de codage - ici, la valeur par défaut 'ascii' encodage qui est en échec, parce que c'est de la rencontre d'un codepoint qui n'est pas valide pour ASCII.
Pour résoudre ce problème, vous avez besoin pour passer seulement les chaînes unicode dans votre modèle - décoder la chaîne en utilisant le codec approprié avant de la passer en.
{{person.firstname}}
itération sur les résultats d'une requête.Pouvez-vous inclure votre définition d'un modèle trop? Si vous utilisez un StringProperty, les chaînes doivent déjà être en Unicode. Aussi, pouvez-vous essayer de séparer la problématique du modèle de la ligne en plusieurs lignes, afin que nous puissions voir exactement où la propriété est de vous donner le problème? Enfin, c'est pas un cast - il de décodage. La différence est que le décodage nécessite un codec.
Merci pour l'info. La définition du modèle est le modèle de l'Utilisateur à partir de webapp2 webapp-improved.appspot.com/api/webapp2_extras/appengine/auth/...
OriginalL'auteur Nick Johnson
Le meilleur est d'obtenir la chaîne convertie en jeu de caractères ASCII. Vous pouvez utiliser le python encoder cgi fonction pour convertir ASCII
Exemple
OriginalL'auteur Sallu
Cast le texte/HTML vous passer au modèle au format Unicode et vous devriez le voir s'en aller. Ont eu ce problème avant avec des modèles Django en FGA avec webapp2.
OriginalL'auteur David Haddad