在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字符。要将CJK语言的Unicode字符包含在slug中,必须使用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): 根据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等细微格式化中非常有用。
示例:
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项目的必备工具。
目前沒有評論。