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