2012-05-15 4 views
5

mongodb 및 redis를 사용하고 있습니다. redis가 내 캐시입니다.redis에서 유니 코드 저장하지만 오류 가져 오기

내가 레디 스-PY와 MongoDB의 객체를 캐시 해요 :

obj in mongodb: {u'name': u'match', u'section_title': u'\u6d3b\u52a8', u'title': 
u'\u6bd4\u8d5b', u'section_id': 1, u'_id': ObjectId('4fb1ed859b10ed2041000001'), u'id': 1} 

hgetall와 레디 스에서 가져온 OBJ (키, OBJ)입니다 :

{'name': 'match', 'title': '\xe6\xaf\x94\xe8\xb5\x9b', 'section_title': 
'\xe6\xb4\xbb\xe5\x8a\xa8', 'section_id': '1', '_id': '4fb1ed859b10ed2041000001', 'id': '1'} 

당신이 볼 수 있듯이, OBJ 인출 캐시에서 str은 유니 코드가 아닌 str이므로 내 응용 프로그램에서 'ascii'코덱은 12 진수 바이트 0xe6을 디코딩 할 수 없습니다. 서수는 범위에 없습니다 (128)

누구든지 제안 할 수 있습니까? 각 문자열에 대해

+1

그리고 어떻게 redong으로 mongodb 개체를 저장합니까? – Denis

답변

7

업데이트, 글로벌 설정의 경우 jmoz's answer을 확인하십시오. 당신은 더 나은에 좋겠,

class DecodeConnectionFactory(redis_cache.pool.ConnectionFactory): 
    def get_connection(self, params): 
     params['decode_responses'] = True 
     return super(DecodeConnectionFactory, self).get_connection(self, params) 

당신이 사용하고있는 가정 레디 스를-평 :

사용하면 다음과 같은 django-redis lib에는 타사를 사용하는 경우, 당신은 ConnectionFactory 정의를 지정해야 할 수도 있습니다 Redis에 unicode 대신 str을 전달하거나 *set 명령에 대해 Redis will encode it automatically을 전달하십시오. 일반적으로 in UTF-8입니다. *get 명령의 경우 Redis는 형식의 형식 값에 대해 알지 못하므로이 값을 str에 직접 반환해야합니다.

따라서 Denis는 Redis에 개체를 저장하는 방식이 중요하다고 말했습니다. Redis 레이어를 투명하게 만들려면 값을 str으로 변환해야합니다. 대신 ascii

+0

그들은 왜 자동으로 인코딩하겠습니까? 그렇다면 그냥 문자열을 남겨 두어야합니까? – jmoz

+0

@jmoz 확실치는 않습니다. 저자가 이유를 알고있을 수도 있습니다.그러나 psycopg2와 같은 어댑터와 달리 일반적으로 redis-py 클라이언트는 데이터가있는 원래 데이터 유형을 저장하지 않습니다. 따라서 데이터 (문자열)의 원래 유형과 해독 방법을 정확히 알 수있는 방법이 없습니다. 어쩌면'str'을 다른 타입의 값을 받아들이는 대신 암묵적으로'str'으로 변환하는 것이 더 낫지 만 누가 압니다. – okm

+1

@okm 나는 이것에 관해서 다른 것을 발견했다. 내 대답을 확인해 보라. – jmoz

6

을 사용하면 decode 함수를 사용하여 utf-8 형식으로 변환 할 수 있습니다. 값에 코드에서 제목 필드 경우 :

In [7]: a='\xe6\xaf\x94\xe8\xb5\x9b' 

In [8]: a.decode('utf8') 
Out[8]: u'\u6bd4\u8d5b' 
+0

남자 나는 hi가 디코드 - 인코딩 재미가 아니라 캐시를 원한다고 생각한다. – Denis

3

내가 당신을 제안 항상 MongoDB를 나 레디 스 (또는 외부 시스템)에 기록하기 전에 UTF-8로 인코딩합니다. 결과를 얻을 때 ('utf-8') 디코딩하면 파이썬에서 유니 코드로 작업하게됩니다.

25

를 사용 또한

, set the default encoding to UTF-8은 내가 문제를 발견했습니다 생각합니다. 이 글을 읽은 후, 나는 통증이지만, 작동하는 붉음에서 명시 적으로 해독해야했습니다.

필자의 출력물이 광산과 다른 obic 인 모든 유니 코드 문자열 인 블로그 게시물을 발견했습니다.

StrictRedis.__init__을 보면 decode_responses 매개 변수는 기본적으로 False입니다. https://github.com/andymccurdy/redis-py/blob/273a47e299a499ed0053b8b90966dc2124504983/redis/client.py#L446

구조상에 decode_responses=True을 입력하면 나를 위해이 문제가 해결됩니다.

+0

고맙습니다. 나중에 시도하겠습니다. 내 코드를 엉망으로 만들지 않기 때문에 아마도 이것이 최고의 솔루션 일 것입니다. – goofansu

+0

이것은 굉장합니다. 감사. –

+1

허용 된 답변이어야합니다. – raben