Django 개발 시 문자열을 다루는 일은 밥 먹듯이 일어납니다. 사용자 입력을 정리하고, URL을 생성하며, 텍스트를 요약하는 등 다양한 처리가 필요합니다. django.utils.text는 이러한 일상적인 텍스트 처리를 위한 강력하고 편리한 유틸리티 함수들을 모아놓은 모듈입니다.🧰
이 포스트에서는 django.utils.text 모듈에서 가장 유용하고 자주 쓰이는 핵심 기능들을 살펴보겠습니다.
1. URL을 위한 완벽한 변환기: slugify
이 모듈의 존재 이유라고 해도 과언이 아닐 정도로 가장 유명한 함수입니다. 슬러그(slug) 란, 주로 URL의 일부로 사용하기 위해 제목이나 문자열을 간소화한 버전을 의미합니다.
slugify는 문자열을 다음과 같이 변환합니다.
- 소문자로 변경합니다.
- 특수문자(공백 포함)를 하이픈(
-)으로 대체합니다. - 알파벳, 숫자, 하이픈, 밑줄(_) 외의 문자를 제거합니다.
예제:
from django.utils.text import slugify
title = "Django 5.0 Release! What's new?"
slug = slugify(title)
print(slug)
# 결과: 'django-50-release-whats-new'
# 이제 이 값을 /blog/django-50-release-whats-new/ 처럼 URL에 사용할 수 있습니다.
<중요> CJK 언어(중국어, 일본어, 한국어) 및 유니코드 지원: 기본적으로
slugify는 ASCII 문자만 남깁니다. CJK 언어의 유니코드 문자를 슬러그에 포함하려면allow_unicode=True옵션을 반드시 사용해야 합니다.
title_ko = "장고 유틸리티 총정리"
# 기본 (한글 사라짐)
print(slugify(title_ko))
# 결과: '' (빈 문자열)
# 유니코드 허용
print(slugify(title_ko, allow_unicode=True))
# 결과: '장고-유틸리티-총정리'
2. 안전한 파일 이름 생성: get_valid_filename
사용자가 업로드한 파일 이름을 그대로 서버에 저장하는 것은 매우 위험합니다. 파일 이름에 ../ (경로 탐색) 같은 문자가 포함되어 있거나, 윈도우에서 사용할 수 없는 특수문자(:, *, ?)가 포함될 수 있습니다.
get_valid_filename은 이러한 위험한 문자나 시스템 예약어를 안전한 문자(주로 밑줄 _)로 치환하여 유효한 파일 이름만 반환하도록 보장합니다.
예제:
from django.utils.text import get_valid_filename
# 사용자가 악의적으로 업로드한 파일 이름
user_filename = "../../secrets/pa$$word.txt"
safe_name = get_valid_filename(user_filename)
print(safe_name)
# 결과: '.._.._secrets_pa__word.txt'
# 시스템 예약 문자
windows_filename = "CON:MyFile.pdf"
safe_name_2 = get_valid_filename(windows_filename)
print(safe_name_2)
# 결과: '_CON_MyFile.pdf'
3. 깔끔한 요약본 만들기: truncatechars / truncatewords
블로그 목록 페이지에서 긴 본문을 미리 보여줄 때 자주 사용되는 기능입니다. Django 템플릿 필터(|truncatechars:50)로도 유명하지만, 파이썬 코드 레벨에서는 이 함수들을 직접 사용할 수 있습니다.
truncatechars(text, length):length글자 수(공백 포함) 기준으로 자르고, 잘렸다면 뒤에...(기본값)를 붙입니다.truncatewords(text, num):num단어 수 기준으로 자르고, 잘렸다면 뒤에...를 붙입니다.
예제:
from django.utils.text import truncatechars, truncatewords
long_text = "Django is a high-level Python web framework that encourages rapid development."
# 1. 글자 수 기준 (20자)
summary_chars = truncatechars(long_text, 20)
print(summary_chars)
# 결과: 'Django is a high-le...'
# 2. 단어 수 기준 (5단어)
summary_words = truncatewords(long_text, 5)
print(summary_words)
# 결과: 'Django is a high-level Python...'
4. 첫 글자만 대문자로: capfirst
간단하지만 의외로 자주 쓰이는 유틸리티입니다. 문자열의 첫 번째 글자만 대문자로 변경합니다. 모델의 verbose_name을 템플릿에 표시하는 등 소소한 서식(Formatting)에 유용합니다.
예제:
from django.utils.text import capfirst
label = "user name"
formatted_label = capfirst(label)
print(formatted_label)
# 결과: 'User name'
5. 자연스러운 목록 변환: get_text_list
파이썬 리스트(list)를 사람이 읽기 쉬운 자연어 문장으로 변환해 줍니다. 마지막 항목 앞에는 "and" (혹은 다른 접속사)를 붙여줍니다.
예제:
from django.utils.text import get_text_list
# 항목이 여러 개일 때 (기본값: 'and')
items_1 = ['Apple', 'Banana', 'Cherry']
print(get_text_list(items_1))
# 결과: 'Apple, Banana and Cherry'
# 접속사 변경 (예: 'or')
items_2 = ['Email', 'SMS']
print(get_text_list(items_2, 'or'))
# 결과: 'Email or SMS'
# 항목이 하나일 때
items_3 = ['Django']
print(get_text_list(items_3))
# 결과: 'Django'
요약
django.utils.text 모듈은 Django 개발 시 텍스트를 다루는 데 필요한 거의 모든 '잔손질'을 해결해 줍니다. 이 모듈을 잘 활용하면 코드가 더 깔끔해지고, URL이나 파일 이름을 다룰 때 발생할 수 있는 잠재적인 보안 문제도 예방할 수 있습니다.
특히 slugify 와 get_valid_filename 은 Django 프로젝트의 필수 유틸리티라 할 수 있습니다.
댓글이 없습니다.