2012-02-10 4 views
3

어떤 Python 개발자라도 필자는 지난 몇 년 동안 Python의 Unicode 문제로 혼란에 빠져있었습니다. 하지만 지금 나는 열매를 맺고 스스로 해결할 수없는 상황이 있습니다. 이미 recherches을 포함하여, 현재 일일했다 ..Django & Suds : QuerySet을 사용할 때 UnicodeEncodeError

내 설치가 SOAP를 통해 원격 시스템에 연결하는 작은 장고 응용 프로그램입니다 일부 데이터를 당겨 장고의 데이터베이스에서 찾고, (배트를 사용하여) :

from myapp.models import Customer 
client = suds.client.Client(...) 
customer = client.service.getCustomerByEmail('[email protected]') 

type(customer.email): <class 'suds.sax.text.Text'> 

customer_exists = Customer.objects.filter(email=customer.email) 
지금 고객의 이메일 주소는 다음과 장고는 예외를 발생시킬 수있는 독일어 움라우트 ü있다 :

Traceback (most recent call last): 
    File "run_anatomy_client.py", line 19, in <module> 
    print client.main() 
    File "/Users/user/Documents/workspace/Wawi/application/myapp/client.py", line 282, in main 
    if not Customer.objects.filter(email=customer.email.encode('latin1')): 
    File "/Users/user/Documents/workspace/Wawi/application/myapp/client.py", line 76, in sync_customer 
    if not customer_exists: 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/query.py", line 113, in __nonzero__ 
    iter(self).next() 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/query.py", line 107, in _result_iter 
    self._fill_cache() 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/query.py", line 772, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql 
    cursor.execute(sql, params) 
    File "/Users/user/Documents/workspace/Wawi/pyenv/lib/python2.7/site-packages/django/db/backends/util.py", line 43, in execute 
    logger.debug('(%.3f) %s; args=%s' % (duration, sql, params), 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 28: ordinal not in range(128) 

이미 인코딩(), 디코드()와 함께 연주를, 소스 파일의 코드를 변경 뿐만 아니라 데이터베이스 l , ayout 현재 다음 보이는 어떤 : - :

mysql> show variables like '%character%'; 
+--------------------------+-----------------------------------------+ 
| Variable_name   | Value         | 
+--------------------------+-----------------------------------------+ 
| character_set_client  | latin1         | 
| character_set_connection | latin1         | 
| character_set_database | utf8         | 
| character_set_filesystem | binary         | 
| character_set_results | latin1         | 
| character_set_server  | latin1         | 
| character_set_system  | utf8         | 
| character_sets_dir  | /opt/local/share/mysql5/mysql/charsets/ | 
+--------------------------+-----------------------------------------+ 
8 rows in set (0.00 sec) 

이상한 일이되어 나는 추적 점을 설정하고 장고 쉘에서 동일한 라인을 실행하면, 그것은 인코딩()를 사용할 때 잘 작동

(Pdb) Customer.objects.filter(email=customer.email) 
*** UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 28:  ordinal not in range(128) 
(Pdb) Customer.objects.filter(email=customer.email.encode('utf-8')) 
[] 

내가 어떤 힌트 감사 할 것 ..

+0

안녕하세요, 유니 코드 (customer.email, 'iso8859-1')를 사용해보세요. 도와 주시면 알려주세요 ... – Jingo

+0

Th (고객 = 이메일, 'iso8859-1')) : TypeError : 유니 코드의 디코딩이 지원되지 않습니다. –

+0

문제를 해결할 수 있었습니까? 같은 문제가있는 것처럼 보입니다. – Fedor

답변

2

suds.sax.text.Text 유니 코드에서 상속

class Text(unicode): 
    """ 
    An XML text object used to represent text content. 
    @ivar lang: The (optional) language flag. 
    @type lang: bool 
    @ivar escaped: The (optional) XML special character escaped flag. 
    @type escaped: bool 
    """ 

함께 작업하려면 UTF-8로 인코딩하면됩니다.

email = customer.email.encode("utf-8") 
customer_exists = Customer.objects.filter(email=email) 
+0

customer.encode ('utf-8') 대신 유니 코드 (고객)를 사용하는 것이 더 좋을 것이라고 생각합니다. – Fedor

+0

나는 정확히 같은 문제가있었습니다. 이것에 대해 고마워! –

0

나는 무슨 일이 일어나고 있는지 알아 내려고 2 시간 이상 시간에 내가 저장할 수없는 이유 장고는 객체의 필드에 배트 데이터 구조의 값을 할당 한 후 객체.

@guillaumevincent는 Suds Text 클래스는 유니 코드에서 상속 받았으며 구현이 100 % 정확하지 않으므로 Django는 기본 유니 코드 유형에서 작동하는 일부 작업을 수행 한 후에 실패합니다.

그래서 질문의 예를 들어 나는

customer_exists = Customer.objects.filter(email=unicode(customer.email))

할 것입니다 그리고 내 경우에는 내가 희망이 사람에 대한 약간의 시간을 절약 할 수 유사

django_obj.field_name = suds_obj.field_name

을했다 :)

+0

unicode()는 python 3에서 정의되지 않았습니다. 내 솔루션은 Python 2.7 및 Python 3에서 작동합니다. –

관련 문제