在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'
# 现在可以将这个值用作URL,例如/blog/django-50-release-whats-new/。
<重要> CJK语言(中文、日文、韩文)及Unicode支持: 默认情况下,
slugify只保留ASCII字符。若要在slug中包含CJK语言的Unicode字符,必须使用allow_unicode=True选项。
title_ko = "장고 유틸리티 총정리"
# 默认(韩文消失)
print(slugify(title_ko))
# 结果: '' (空字符串)
# 允许Unicode
print(slugify(title_ko, allow_unicode=True))
# 结果: '장고-유틸리티-총정리'
2. 安全的文件名生成: get_valid_filename
直接将用户上传的文件名保存到服务器是非常危险的。文件名中可能包含../(路径遍历)等字符,或者在Windows中无法使用的特殊字符(:、*、?)。
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)中非常有名,但在Python代码中也可以直接使用这些函数。
truncatechars(text, length): 根据指定的字数(包括空格)进行截断,如果被截断,后面添加...(默认值)。truncatewords(text, 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等格式化方面非常有用。
示例:
from django.utils.text import capfirst
label = "user name"
formatted_label = capfirst(label)
print(formatted_label)
# 结果: 'User name'
5. 自然的列表转换: get_text_list
将Python列表(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项目的必备工具。
目前没有评论。