January 2008
M T W T F S S
« Dec   Feb »
 123456
78910111213
14151617181920
21222324252627
28293031  

2008년 01월에 쓴 글들

django 0.96 에서 0.96.1로 판올림 할 때 주의할 점

[ 2008-Jan-29, 00시 32분] [ Category : 잘난 척 하기 ] [ 엮인글수 : 2 ]

python에서 쓸만한 웹 프레임워크인 django를 0.96에서 0.96.1로 판올림 할 때 주의할 점이 있습니다. Django 공식 누리집에는 0.96을 기준으로 문서가 나와있어서 무작정 django를 최신판으로 판올림하면 오류가 발생합니다. 잘 되던 소스가 갑자기 뻗어서 깜짝 놀랐네요.

DB Model

기존엔 문자열 최대 길이를 지정할 때 maxlength 라는 예약어를 썼는데 0.96.1부터는 max_length를 씁니다.

class Entries(models.Model):
	me2permalink = models.CharField(max_length=250, null=False)
	content = models.TextField(max_length=150, null=True)
	comment_count = models.SmallIntegerField(default=0, null=True)
	voted = models.SmallIntegerField(default=0, null=True)
	reg_date = models.DateTimeField(auto_now_add=True)
	channel = models.SmallIntegerField(default=1, null=False)

위 예제는 미투데이용 그림자놀이에서 쓰고 있는 글 저장 테이블.

i18n에서 ugettext 오류

0.96.1에선 ugettext 가 빠졌습니다. 그냥 gettext를 쓰면 됩니다. 어차피 python 자체도 unicode 기반으로 돌아가는데 ugettext가 좀 무의미하긴 했죠.

from django.utils.translation import gettext as _

HttpResponse에서 content_type

HttpResponse로 문자열을 뿌릴 때 content_type=’text/javascript’ 이런 식으로 content_type을 쓰면 안됩니다. 0.96.1부터 없어졌기 때문이죠. 원래 있던 mimetype만 쓰면 됩니다.

HttpResponse(ret_data, mimetype='text/javascript')

template tag로 문자열 넘길 때 utf-8 문제

django에서 템플릿 태그를 만들어서 쓰고 있습니다. 문자열을 넘기면 일부를 잘라다 출력합니다.

{{comment.entry.content|cutstring:20}}

이러면 comment.entry.content 에 들어가 있는 문자열을 내가 만든 cutstring이라는 함수로 넘깁니다. 이 함수는 이렇게 생겼습니다.

def cutstring(value, length):
	if len(value) > length:
		return value[0:length] + '...'
	return value
cutstring = stringfilter(cutstring)

보시다시피 아주 간단하죠. 근데 0.96.1로 판올림을 하니까 value로 넘겨 받은 문자가 utf-8가 아니라 ascii였습니다. 언제나 그런 것도 아니고 어떨 때는 unicode로 넘기고 어떨 때는 ascii. -_-; 이 둘 큰 차이점은 ascii는 위와 같이 문자열을 자를 때 byte 단위로 자르고, unicode는 글자 단위로 자르는 데 있습니다. 이때문에

s1 = '안녕? 반가워'
s2 = u'안녕? 반가워'

라고 하고, s1[0:5] 라고 하면 ‘안녕?’이 나오고, s2[0:5]라고 하면 ‘안녕? 반’이 나옵니다.

실제로 utf-8로 처리 됐으면 ‘나만의 (자칭 귀여운) 강박증. 걸을’ 이라고 잘려야 할 문자열이 ascii로 되면서 ‘나만의 (자칭 �’라고 잘렸습니다.

이런 경우 문서에서는 force_unicode()를 쓰라고 하지만, svn이나 웹으로 받은 django 0.96.1 어디에도 저런 놈은 없었습니다. 문서대로라면 django/utils/encode.py 에 있어야 하는데, 0.96.1엔 없고 0.97 pre판부터 django/utils/encoding.py 에 있습니다.

결국, 강제로 unicode로 문자열을 바꿔서 해결했습니다.

def cutstring(value, length):
	if type(value) != 'unicode':
		value = unicode(value, 'utf-8')
	if len(value) > length:
		return value[0:length] + '...'
	return value
cutstring = stringfilter(cutstring)

단, 0.97 pre판부터는 위와 같이 하면 unicode는 지원하지 않는다며 오류가 납니다. 이때에는 value = unicode(value, ‘utf-8′) 이라고 하지 말고 value = force_unicode(value)이라고 해야 합니다. 이런 식으로 처리하면 되겠죠. (start_unicode 같은 애들도 있는데, 각 각의 차이점은 Unicode data in Django (공식 문서)를 참조하세요.)

import django
if django.VERSION[0] == 0 and django.VERSION[1] >= 97:
    from django.utils.encoding import force_unicode

def cutstring(value, length):
	if type(value) != 'unicode':
            if django.VERSION[0] == 0 and django.VERSION[1] < 97:
		value = unicode(value, 'utf-8')
            else:
                value = force_unicode(value)

	if len(value) > length:
		return value[0:length] + '...'
	return value
cutstring = stringfilter(cutstring)

아참. 넘어오는 문자열이 혹시 utf-8가 아니라 euc-kr 같은 것이라면 unicode(value, ‘utf-8′) 가 아니라 unicode(value, ‘euc-kr’) 이라고 해야 합니다..

미투데이용 익명 게시판 서비스, 그림자놀이 개장

[ 2008-Jan-25, 11시 31분] [ Category : 나른한 오후의 단상 ] [ 엮인글수 : 1 ]

여는 글

안녕하세요, 한날입니다.

지난 1월 16일에 그림자놀이라는 이름으로 익명 게시판 서비스 중 한 갈래이자 미투데이용 장난감(mash-up, 매시업 ^^)을 하나 만들었습니다. 그리고, 서비스 개장한지 9일째인 방금 전에 100번째 그림자놀이 참여자가 나타났네요. ^^

익명 게시판은 다들 아시죠? 이름을 감추고 글을 주고 받는 게시판이죠. 제가 워낙 익명성에 오래 전부터 관심이 많았고, 여러 곳에 있는 익명 게시판들도 눈 여겨 보곤 했습니다. Open ID에 관심을 갖는 이유도 믿을 수 있는 익명이라는 특성을 가질 수 있다고 보기 때문이죠. 그래서 믿을 수 있고 정체가 명확히 있지만 누군지 알 수 없는 익명 소통 도구를 구상하곤 했습니다. 가장 흔한 형태가 익명 게시판이고요.

미투데이는 작년 2월 25일(26일인가?)부터 써왔습니다. 참 매력 가득한 서비스지요. 써오면서 미투데이가 가진 사람과 사람 연결선(link node)이 매우 흥미롭다고 느꼈는데, 마침 Open ID와 Open API를 지원하고 있기에 익명에 대한 작은 시도를 미투데이에 먼저 살짝 시도해봤습니다.

서비스 이름은 그림자 놀이입니다. 아직은 미투데이용 그림자 놀이만 있으므로 방문하시면 http://shadow.hannal.com/me2day로 이동하지요.

각종 발상들 적은 포스트잇 사진
그림자 놀이에 넣을 기능들을 포스트잇에 붙여 정리한 모습

소개 글

미투데이용 그림자놀이는 미투데이에서 익명으로 글을 쓰거나 댓글을 쓰며 소통을 할 수 있도록 도와주는 미투데이용 작은 서비스입니다. “미투데이용”이라는 이름에서 알 수 있듯이 미투데이 이용자만 쓸 수 있습니다.

특징은 익명입니다. 그림자씨라는 이름을 가진 가상 인물에게 내가 쓰는 글이나 댓글을 대신 쓰게 해서 내 정체를 숨기는 것이죠.

  1. 그림자놀이에서 글을 쓴다
  2. 그림자놀이의 미투데이 공간인, 그림자씨에 “그림자씨” 이름으로 글이 올라온다.
  3. 그림자놀이에서 댓글을 달아도 “그림자씨”로 올라온다.
  4. 미투데이에 있는 다른 이용자 글에 익명(그림자씨)으로 댓글도 달 수 있다. ^^ (단, 그림자놀이 참여자의 글에 한함)

미투데이용 뿐 아니라 다른 서비스용이나 일반용(?) 그림자놀이도 개장할 예정이나 이건 좀 더 많은 준비가 필요해서 당분간 계획은 없습니다. 그러니 마음 편하고 자유로이 익명 즐거움을 느끼고 싶다면 미투데이용 그림자놀이로 오세요! :)

이용 방법

미투데이용 서비스이니 우선 미투데이에 계정이 있어야 합니다. 아직 미투데이 계정이 없으시다면 아래 초대 공간으로 오셔서 만드세요. 미투데이는 초대제거든요.

* 그림자놀이에 바로 참여할 수 있는 미투데이 초대 공간으로 가기

위 공간을 통해 미투데이에 가입을 하면 자동으로 그림자 놀이에 참여하게 됩니다. 가입 과정에서 Open ID를 만드는데 거기서 만드는 Open ID를 꼭 기억해두세요.

이미 미투데이 계정이 있으시다면 미투데이에 있는 그림자놀이 공간인 그림자씨에게 친구 신청을 해서 직접 참여해야 합니다. 그림자씨와 친구가 돼야 그림자씨가 여러분을 숨겨주고 대신 글이나 댓글을 씁니다. 친구 신청 수락은 제가 최첨단 수동 기능으로 처리하니까 얼른 친구 관계가 되지 않아도 조금만 참으세요. :)

자, 이제 끝났습니다. 이제 미투데이용 그림자놀이에 가셔서 여러분의 Open ID로 로그인을 하면 미투데이용 그림자놀이에 참여하게 됩니다.

정말 익명인가?

그림자놀이는 이용자가 어떤 글이나 댓글을 썼는지 전혀 알 수 없습니다. 왜냐하면 글이나 댓글에 이용자 정보를 아예 남기지 않기 때문입니다. 그래서 해당 부분 소스 코드를 공개하거나 DB 구조를 공개하고 있으며, 필요할 경우 직접 운영 중인 서비스 소스와 DB를 보여드리기도 합니다.

안심하고 마음껏 즐기세요.

개발 정보

최근 몇 년 동안 RoR이라고 불리우는, Ruby라는 프로그래밍 언어를 기반으로 하는 Rails라는 웹 프레임워크가 인기를 끌었습니다. 미투데이도 RoR 기반이지요. 저도 RoR에 관심이 많았지만, Python이라는 프로그래밍 언어에 관심이 더 많았던지라 Python 언어를 기반으로 하는 django라는 웹 프레임워크를 이용해 그림자 놀이를 만들었습니다.

현재 Python 2.5, django 0.96, mysql 5 조합으로 운영되고 있으며, python 코드는 Fast cgi로 돌아가고 있습니다. 반응이 상당히 빠르고 좋아요. :D

아직 능숙하게 다루지는 못하지만, 나중에 짬이 되면 python + django로 뭔가를 만드는 강좌를 써볼까 생각 중입니다. 이미 좋은 참고 글이 많지만 상당 수가 영문 글이거나 한글 글이더라도 수가 적어 이래 저래 고생을 했습니다. 그래서 좀 더 여러 이야기를 다뤄보고 싶긴 하네요.