用Django开发的页面,之前用的是python3.X,后来又换成python2.X后各种报错,编码问题,于是在所有python文件开头加了编码:#coding=utf-8

但是后来发现,有些文件加了#coding=utf-8还是不起作用,如现在在一个网页报错:

于是在Django项目的views.py下加了如下四行代码:

# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

后来发现有网友和我的问题一样,但是他的解决方法和我不一样:https://stackoverflow.com/questions/27435622/python-ascii-codec-cant-encode-character-u-xe9-in-position-5-ordinal-not

我也贡献了我的答案my  solution:

Hi,your problem is same with mine,just encode question, you can add bellow code in your views.py of django project:

# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

my problem:
Error during template rendering
In template D:\PythonProjects\DjangoProject\guest\sign\templates\sign\guest_manage.html, error at line 72

I'm trying to run a quick Django application that pulls data from Google AdWords and exposes the names of accounts that are managed by an agency. When doing so, I get the following error:

UnicodeEncodeError at /account-hierarchy/
'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)

Here's the snippet:

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

where the call to {{ field }} is the problematic line.

I have already added

<meta http-equiv="content-type" content="text/html; charset=utf-8">

to the template I am rendering, but it still fails, so I believe the problem is not on the HTML template, but rather on the Python/Django engine.

Any ideas how I can fix it?

Here's the View code that renders the template:

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

UPDATED Question

  • Python Version: 2.7.6
  • Models.py is currently empty

What's also curious is that if I remove this:

{% for field in account %}
<td>{{ field }}</td>
{% endfor %}

and I just print out the main array:

{{ managed_accounts }}

it works just fine. Not sure what's going on.

Curious fact #2: As I managed to output the full array, I checked for character 'é' and I didn't find it on the final output. Not sure where it was coming from.

asked Dec 12 '14 at 1:52
daniel_c05

6,951115274
 
    
Perhaps define the __unicode__ method in your models.py would work – dazedconfused Dec 12 '14 at 1:57 
    
Could you also include some related codes in your models.py? – dazedconfused Dec 12 '14 at 2:13
    
I am not using any models yet. So models.py is empty. – daniel_c05 Dec 12 '14 at 2:15
    
Then you would probably need to encode some of the data in managed_accounts – dazedconfused Dec 12 '14 at 2:18

The problem is likely that, in some place in your code, you accidentally defined a data structure to be a Python byte string, when you should have made it a Python Unicode string. This leads Django and Python to convert from Django's Unicode string to your byte string, in a default way, using the ASCII codec.

The error message gives some clues:

  • The error is perhaps occurring when you call account_hierarchy()
  • The phrase character u'\xe9' in position 5: ordinal not in range(128) means that Python is trying to convert Unicode character 'é' (U+00E9) into an ASCII value from 0..127. Look in your data for an 'é'. Which field is it in?
  • The phrase 'ascii' codec means the conversion is likely inadvertent. If you intend to use UTF-8, you wouldn't have called the ASCII codec intentionally. But when you cause a conversion but don't specify a codec, Python uses ASCII.
  • The word encode means conversion from Unicode to byte-oriented encoding. You have read Python's Unicode HOWTO article a couple of times, haven't you?

Function render_to_response() uses settings DEFAULT_CHARSET and DEFAULT_CONTENT_TYPE](https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_CONTENT_TYPE). They should default to 'utf-8' and 'text/html', which should be appropriate for generating a UTF-8 encoded HTML page, but check.

I like the suggestion that you check your models.py to be sure that your models are defined in terms of Unicode data types, not byte string data types. Update: you say models.py is empty, so that won't be much help.

Character handling, and Unicode vs byte strings, are handled differently in Python 2 and Python 3. Which version of Python are you using? Update: Python 2.7.6, thanks. The Unicode HOWTO I linked to above is for Python 2.7.x.

If you make sure your code handles strings as Unicode throughout, unless you really want a byte string, that will likely fix this problem.

Update: Consider modifying your template to give you debugging information. Try something like these expressions, to see what's really in 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 %}

[Updated in response to multiple updates from original poster.]

answered Dec 12 '14 at 2:21
Jim DeLaHunt

6,50812948
 
    
Nice and detailed answer! – dazedconfused Dec 12 '14 at 2:29

Your Answer

Django html页面 'ascii' codec can't encode characters in position 8-10: ordinal not的更多相关文章

  1. 解决UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position

    最近用Python写了些爬虫,在爬取一个gb2312的页面时,抛出异常: UnicodeEncodeError: 'ascii' codec can't encode characters in po ...

  2. Python编码问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(12

    今天安装了PyScripter编辑器,刚要写代码,突然就出现异常: <span style="font-size:14px;color:#ff0000;">>&g ...

  3. python+selenium运行报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

    使用python+selenium运行自动化脚本时,打印某一段文字出现UnicodeEncodeError: 'ascii' codec can't encode characters in posi ...

  4. 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)的解决办法

    使用的python2.7,运行的时候出现了'ascii' codec can't encode characters in position 0-8: ordinal not in range(128 ...

  5. Pip 安装 出现UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in

    在Python 环境下,使用PiP 命令安装时,报错提示: UnicodeEncodeError: 'ascii' codec can't encode characters in position ...

  6. 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题(转)

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128 ...

  7. UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-15: ordinal not in range(128)

    python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报类似这样的错误. UnicodeEncodeError: 'ascii' codec can't ...

  8. 解决Python2.7的UnicodeEncodeError:'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)异常错误

    解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误 大家都知道,在使用python进行网络爬虫时,最头疼的就是转码问题,下面是 ...

  9. 【转】Python3—UnicodeEncodeError 'ascii' codec can't encode characters in position 0-1

    转自:https://blog.csdn.net/AckClinkz/article/details/78538462 环境 >>> import sys >>> ...

随机推荐

  1. 初学者怎么快速掌握Linux运维?

    2018年里,Linux运维的职位数量和平均薪资水平仍然持续了去年的强劲增幅,比很多开发岗位涨的都快.从研究机构的数据来看,Linux职位数量和工资水平涨幅均在IT行业的前五之列,比去年的表现还要好一 ...

  2. 7-20 Windows消息队列 (25 分)(模拟水题)

    题意: 思路: 用优先队列直接模拟就OK了,另外优先队列存pair的时候比较的是first的值,实测!! 上代码: #include <iostream> #include <que ...

  3. 六、Scrapy中Download Middleware的用法

    本文转载自: https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/downloader-middleware.html https://doc. ...

  4. copy the content of a file muliptle times and save as ordered files:

    input: transient.case outputs: transient_1.case, transient_2.case,...transient_101.case ********** n ...

  5. protel99se 问题汇总(不定期更新)

    1.在PROTEL99SE中,怎样改变敷铜的线宽? 规则---manufacturing----polygon connect style 里面设置:或Power polygon connect st ...

  6. hadoop在线重启namenode+在线扩展集群

    1.执行步骤 修改dfs.namenode.handler.count=150 () NameNode 有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用.处理程序数量越多意味着要更大的 ...

  7. Caffe 工程的一些编译错误以及解决方案

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51371936 整理一下最近遇到caff ...

  8. js两个整数之间求和

    const GetSum = (a, b) => { let min = Math.min(a, b), max = Math.max(a, b); return (max - min + 1) ...

  9. 洛谷 P2084 进制转换

    P4122 [USACO17DEC]Blocked Billboard 题目描述 During long milking sessions, Bessie the cow likes to stare ...

  10. mongodb之存储引擎

    前言 存储引擎是Mongodb管理数据存储主要的组件,Mongodb支持多种存储引擎,每种存储引擎适合特定的场景 WiredTiger 特性 1. version >= 3.2版本默认存储引擎2 ...