2013-05-06 5 views
8

sono un più nuovo in python. Oggi quando scrivo una funzione di ricerca ho incontrato un errore. Io uso sqlalchemy orm per farlo, nella mia funzione, inserisco una parola cinese come parola chiave. La pagina html mi dà un errore UnicodeEncodeError in/user/search: il codec "latin-1" non può codificare i caratteri nella posizione 0- 1: ordinale non compreso nell'intervallo (256). e il mio codice è simile a questo:UnicodeEncodeError: il codec "latin-1" non può codificare i caratteri nella posizione 0-1: ordinale non compreso nell'intervallo (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) 

ed il Traceback è qui:

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

quando ho incontrato l'errore, ho fatto un test in guscio pitone, ha funzionato bene, il codice è qui :

da apps.user.models utente importazione user = User.get_by_name ('某人') .first() stampa utente stampa user.name 某人

così che cosa posso fare per lasciarlo lavorato nella mia pagina html? Molto apprezzato !!

+0

Immagino che il tipo di 'User.name' sia String? Prova a cambiarlo in Unicode. – schlamar

risposta

20

sto supponendo che si sta utilizzando MySQL con il driver MySQLdb qui.

La codifica predefinita utilizzata dal driver MySQLdb è latin-1, che non supporta il set di caratteri. È necessario utilizzare UTF-8 (o altri, ma UTF-8 è il più comune) per poter comunicare con il database tramite MySQLdb (vedere http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode).

di fare una cosa del genere, crea il tuo motore con la seguente riga:

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

Si può anche costruire il vostro URL del motore utilizzando la classe sqlalchemy.engine.url.URL, ed inviarlo alla funzione create engine. Trovo utile quando hai le tue impostazioni in un file di configurazione.

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

Speranza che aiuta.

+0

Sì, ha funzionato ora. Molto apprezzato. – jiank

3

in base al tuo stacktrace, stai usando MySQL Python con codifica unicode attivata, poiché sta eseguendo una codifica. Quindi è probabile che sia necessario specificare una codifica comaptible (notare che questo è tutte le impostazioni utilizzate dal MySQLdb DBAPI, SQLalhcemy appena li attraversa):

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

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

Problemi correlati