我正在尝试运行一个快速的Django应用程序,该应用程序从Google AdWords提取数据并公开由代理机构管理的帐户名称。这样做时,我收到以下错误:
UnicodeEncodeError at /account-hierarchy/
'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
以下是片段:
<table class="pretty-table">
<thead>
<tr>
<td>Customer ID</td>
<td>Client Name</td>
<td>Can Manage Clients</td>
<td>Account Currency</td>
</tr>
</thead>
{% for account in managed_accounts %}
<tr>
{% for field in account %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
对{{ field }}
的调用是有问题的。
我已添加
<meta http-equiv="content-type" content="text/html; charset=utf-8">
到我正在渲染的模板,但它仍然失败,所以我认为问题不在HTML模板上,而是在Python / Django引擎上。
我有什么想法可以解决它吗?
以下是呈现模板的视图代码:
def account_hierarchy(request):
manager_ids = settings.MANAGER_IDS
managed_accounts = []
for manager_id in manager_ids:
managed_accounts.extend(adwords_utils.getManagedAccounts(manager_id))
return render_to_response('simple-table.html', {"managed_accounts": managed_accounts})
更新问题
如果我将其删除,那也很奇怪:
{% for field in account %}
<td>{{ field }}</td>
{% endfor %}
我打印出主阵列:
{{ managed_accounts }}
它运作得很好。不知道发生了什么事。
奇怪的事实#2:当我设法输出完整数组时,我检查了字符'é',但我没有在最终输出中找到它。不知道它来自哪里。
答案 0 :(得分:4)
问题很可能是,在您的代码中的某个位置,您意外地将数据结构定义为Python字节字符串,而您应该将其设置为Python Unicode字符串。这导致Django和Python使用ASCII编解码器以默认方式从Django的Unicode字符串转换为字节字符串。
错误消息提供了一些线索:
account_hierarchy()
character u'\xe9' in position 5: ordinal not in range(128)
表示Python正在尝试将Unicode字符'é'(U + 00E9)转换为0..127的ASCII值。在您的数据中查找“é”。它在哪个领域?'ascii' codec
表示转换可能是无意的。如果您打算使用UTF-8,则不会故意调用ASCII编解码器。但是当你进行转换但没有指定编解码器时,Python会使用ASCII。encode
表示从Unicode转换为面向字节的编码。您已经阅读了Python's Unicode HOWTO article几次,不是吗?功能render_to_response()使用设置DEFAULT_CHARSET和DEFAULT_CONTENT_TYPE](https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_CONTENT_TYPE)。它们应该默认为'utf-8'和'text / html',这应该适合生成UTF-8编码的HTML页面,但请检查。
我喜欢您检查models.py
以确保模型是根据Unicode数据类型而非字节字符串数据类型定义的建议。 更新:你说models.py是空的,所以没有多大帮助。
字符处理和Unicode与字节字符串在Python 2和Python 3中的处理方式不同。您使用的是哪个版本的Python? 更新:Python 2.7.6,谢谢。我上面链接的 Unicode HOWTO 适用于Python 2.7.x。
如果你确保你的代码在整个过程中处理字符串,除非你真的想要一个字节字符串,这可能会解决这个问题。
更新:考虑修改模板以提供调试信息。尝试类似这些表达式的内容,看看managed_accounts
中的真实内容:
</thead>
<tr><td>managed_accounts is: {{ repr(managed_accounts) }}</tr></td>
{% for account in managed_accounts %}
<tr>
{% for field in account %}
<td>{{ type(field) }}, {{ repr(field) }}</td>
{% endfor %}
</tr>
{% endfor %}
[更新了以响应原始海报的多次更新。]
答案 1 :(得分:0)
您的问题与我的问题相同,只需编码问题,您可以在django项目的views.py中添加以下代码:
1. #coding=utf-8
2. import sys
3. reload(sys)
4. sys.setdefaultencoding('utf-8')
我的问题: 模板渲染时出错 在模板D:\ PythonProjects \ DjangoProject \ guest \ sign \ templates \ sign \ guest_manage.html中,第72行出错 enter image description here
答案 2 :(得分:0)
此问题属于jinja2模板,可以通过将编码设置为utf-8作为默认编码来解决。
Author.Country