2013-05-06 37 views
8

i am a new in python.Today khi tôi viết một số chức năng tìm kiếm, tôi đã gặp lỗi.well, Tôi sử dụng sqlalchemy orm để làm điều đó, trong chức năng của tôi, tôi nhập một từ Trung Quốc như là từ khóa. Trang html cho tôi một UnicodeEncodeError tại/người dùng/tìm kiếm: 'latin-1' codec không thể mã hóa các ký tự ở vị trí 0- 1: thứ tự không nằm trong phạm vi (256). và mã của tôi là như thế này:UnicodeEncodeError: 'latin-1' codec không thể mã hóa các ký tự ở vị trí 0-1: thứ tự không nằm trong phạm vi (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) 

và Traceback là ở đây:

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

khi tôi gặp lỗi, tôi đã làm một thử nghiệm trong vỏ trăn, nó làm việc tốt, mã là đây :

từ apps.user.models nhập tài user = User.get_by_name ('某人') .first() in dùng in user.name 某人

vì vậy những gì tôi có thể làm để cho nó hoạt động trong trang html của tôi? Nhiều đánh giá cao !!

+0

Tôi đoán loại 'User.name' là String? Hãy thử thay đổi nó thành Unicode. – schlamar

Trả lời

20

Tôi giả định rằng bạn đang sử dụng MySQL với trình điều khiển MySQLdb ở đây.

Mã hóa mặc định được trình điều khiển MySQLdb sử dụng là latin-1, không hỗ trợ bộ ký tự của bạn. Bạn sẽ cần phải sử dụng UTF-8 (hoặc những người khác, nhưng UTF-8 là phổ biến nhất) để có thể giao tiếp với cơ sở dữ liệu của bạn thông qua MySQLdb (xem http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode).

Để làm được một điều như vậy, tạo ra động cơ của bạn với các dòng sau:

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

Bạn cũng có thể xây dựng url động cơ của bạn bằng cách sử dụng lớp sqlalchemy.engine.url.URL, và gửi nó vào create engine chức năng. Tôi thấy nó hữu ích khi bạn có các thiết lập của bạn trong một tập tin cấu hình.

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

Hy vọng điều đó sẽ hữu ích.

+0

Vâng, nó hoạt động ngay bây giờ. – jiank

3

dựa trên stacktrace của bạn, bạn đang sử dụng MySQL Python với mã hóa unicode được bật, vì nó đang thực hiện mã hóa. Vì vậy, bạn có thể cần phải xác định một mã hóa comaptible (lưu ý đây là tất cả các thiết lập được sử dụng bởi MySQLdb DBAPI, SQLalhcemy chỉ cần vượt qua chúng thông qua):

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

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