2013-05-06 16 views
8

Ich bin ein neuerer in Python.Heute, wenn ich eine Suchfunktion schreibe traf ich einen Fehler. Ich verwende sqlalchemy orm, um dies zu tun, in meiner Funktion gebe ich ein chinesisches Wort als Schlüsselwort ein. Die HTML-Seite gibt mir einen UnicodeEncodeError an/user/search: 'latin-1' Codec kann Zeichen an Position 0 nicht codieren 1: Ordnungszahl nicht im Bereich (256). und mein Code wie folgt aus:UnicodeEncodeError: 'Latin-1' Codec kann Zeichen in Position 0-1 nicht codieren: Ordnungszahl nicht im Bereich (256)

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) 

und die Traceback ist hier:

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 and 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 one 
    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 at /user/search 
Exception Value: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)` 

wenn ich den Fehler traf ich einen Test in Python-Shell hat es gut funktioniert, ist der Code hier :

von apps.user.models Import Benutzer user = User.get_by_name ('某人') .First() Druck Benutzer Druck user.name 某人

so etwas kann ich tun zu lassen, um es in meiner HTML-Seite gearbeitet? Zu schätzen !!

+0

Ich denke, Typ von 'User.name' ist String? Versuchen Sie, es in Unicode zu ändern. – schlamar

Antwort

20

Ich gehe davon aus, dass Sie MySQL verwenden mit dem MySQLdb-Treiber hier.

Die vom MySQLdb-Treiber verwendete Standardcodierung ist latin-1, die Ihren Zeichensatz nicht unterstützt. Sie müssen UTF-8 (oder andere, UTF-8 ist am häufigsten) verwenden, um mit Ihrer Datenbank über MySQLdb kommunizieren zu können (siehe http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode).

, so etwas zu tun, Ihren Motor mit der folgenden Zeile erstellen:

create_engine('mysql+mysqldb://USER:@SERVER:PORT/DB?charset=utf8', encoding='utf-8') 

Sie können auch Ihren Motor URL mit der sqlalchemy.engine.url.URL Klasse, konstruieren und an die create engine Funktion senden. Ich finde es nützlich, wenn Sie Ihre Einstellungen in einer Konfigurationsdatei haben.

import sqlalchemy.engine.url as 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') 

Hoffe, dass hilft.

+0

Ja, es hat jetzt funktioniert. Vielen Dank. – jiank

3

basierend auf Ihrem Stacktrace, verwenden Sie MySQL Python mit Unicode-Codierung aktiviert, da es eine Codierung tut. So angeben müssen Sie wahrscheinlich eine comaptible Codierung (beachten Sie, das alle Einstellungen von der MySQLdb DBAPI verwendete, SQLalhcemy geht nur um sie durch):

create_engine('mysql+mysqldb:///mydb?charset=utf8&use_unicode=1') 

http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode