python - UnicodeEncodeError:'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256) -
i newer in python.today when write search function met error.well, use sqlalchemy orm that, in function,i input chinese word key word.the html page give me unicodeencodeerror @ /user/search:'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256). , code this:
def user_search(request): name = request.get.get('name').strip() user_list = list() if name: user_list = user.get_by_name(name) class user(object): @classmethod def get_by_name(cls, name): return dbsession.query(cls).filter(cls.name==name) and traceback here:
traceback: file "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) file "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper 75. return func(request, *args, **kwargs) file "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper 39. output = function(request, *args, **kwargs) file "/home/jiankong/git/admin-server/apps/user/user_views.py" in user_search 47. users = jump_page(paginator, page) file "/home/jiankong/git/admin-server/apps/user/utils.py" in jump_page 92. return paginator.page(1) file "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in page 37. number = self.validate_number(number) file "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in validate_number 28. if number > self.num_pages: file "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_num_pages 60. if self.count == 0 , not self.allow_empty_first_page: file "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_count 48. self._count = self.object_list.count() file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in count 2414. return self.from_self(col).scalar() file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in scalar 2240. ret = self.one() file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in 1 2209. ret = list(self) file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in __iter__ 2252. return self._execute_and_instances(context) file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in _execute_and_instances 2267. result = conn.execute(querycontext.statement, self._params) file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in execute 664. params) file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_clauseelement 764. compiled_sql, distilled_params file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_context 871. context) file "/usr/local/lib/python2.6/dist-packages/sqlalchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/default.py" in do_execute 324. cursor.execute(statement, parameters) file "/usr/local/lib/python2.6/dist-packages/mysql_python-1.2.4-py2.6-linux-i686.egg/mysqldb/cursors.py" in execute 183. query = query % db.literal(args) file "/usr/local/lib/python2.6/dist-packages/mysql_python-1.2.4-py2.6-linux-i686.egg/mysqldb/connections.py" in literal 264. return self.escape(o, self.encoders) file "/usr/local/lib/python2.6/dist-packages/mysql_python-1.2.4-py2.6-linux-i686.egg/mysqldb/connections.py" in unicode_literal 202. return db.literal(u.encode(unicode_literal.charset)) exception type: unicodeencodeerror @ /user/search exception value: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)` when met error, did test in python shell, worked well,the code here:
from apps.user.models import user user = user.get_by_name('某人').first() print user print user.name 某人
so can let worked in html page?much appreciate!!
i'm assuming you're using mysql mysqldb driver here.
the default encoding used mysqldb driver latin-1, not support character set. you'll need use utf-8 (or others, utf-8 common) able communicate database through mysqldb (see http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode).
to such thing, create engine following line:
create_engine('mysql+mysqldb://user:@server:port/db?charset=utf8', encoding='utf-8') you can construct engine url using sqlalchemy.engine.url.url class, , send create engine function. find useful when have settings in config file.
import sqlalchemy.engine.url url engine_url = url.url( drivername='mysql+' + cfg['mysql_python_driver'], host=cfg['mysql_host'], port=cfg['mysql_port'], username=cfg['mysql_user'], password=cfg['mysql_pwd'], database=cfg['mysql_db'], query={'charset': 'utf8'} ) db = create_engine(engine_url, encoding='utf-8') hope helps.
Comments
Post a Comment