在我学习Django知识的第2天,有同学在评论区向我提出了一个比较好的问题:
这个问题我确实也不确定,不用os模块行不行。于是本着虚心好学的精神,我通过查阅资料,整理了本篇文章,供大家学习参考!
背景
在当前Django 版本 4.2.19的现在,创建的Django项目中,settings.py有关模版目录配置的代码是这样的:
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATES = [
{
……
'DIRS': [BASE_DIR / 'templates'],
……
},
]
而在更古早的Django版本中,创建的Django项目中,settings.py有关模版目录配置的代码是这样的:
TEMPLATES = [
{
……
'DIRS': [],
……
},
]
所以需要手动设置TEMPLATES模版的路径。这个时候,python还是普遍使用os来控制模版路径的,所以我们需要配置模版目录,修改代码为:
TEMPLATES = [
{
……
'DIRS':[os.path.join(BASE_DIR, 'templates')],
……
},
]
发展
随着Python的不断发展,Python 3.4 中引入了Path对象,属于pathlib模块,提供了面向对象的文件系统路径操作方式,而os.path.join属于传统的os模块。
两者差异
1. 底层实现差异
-
BASE_DIR / ‘templates’
使用 pathlib.Path 对象(Python 3.4+ 引入),通过运算符 / 拼接路径,是面向对象的现代路径操作方式。
BASE_DIR 需定义为 Path 对象:
from pathlib import Path
BASE_DIR = Path(file).resolve().parent.parent -
os.path.join(BASE_DIR, ‘templates’)
使用 os.path 模块(Python 标准库),通过字符串拼接路径,是传统的方式。
BASE_DIR 需是字符串(或自动转换后的字符串)。
2. 功能等价性
- 跨平台兼容性
两者均能正确处理不同操作系统的路径分隔符(如 Windows 的 \ 和 Linux/macOS 的 /)。
- Django 兼容性
Django 接受两种形式,因为内部会将其统一为字符串路径。Path 对象在传递时会自动调用 str() 转换。
3. 优缺点对比
- BASE_DIR / ‘templates’(Pathlib 风格)
| 优点 | 缺点 |
|---|---|
| 代码简洁:运算符 / 使路径拼接更直观(如 BASE_DIR / ‘subdir’ / ‘templates’)。 面向对象方法:支持链式调用和丰富操作(如 .exists(), .mkdir())。 类型安全:明确操作对象是路径,而非普通字符串。 | 依赖 Python 3.4+:旧版本 Python 无法使用。 开发者熟悉度:部分人可能更习惯传统 os.path。 |
- os.path.join(BASE_DIR, ‘templates’)(os.path 风格)
| 优点 | 缺点 |
|---|---|
| 广泛兼容性:支持所有 Python 版本。 开发者习惯:适合熟悉传统文件操作的开发者。 | 代码冗长:多层目录需多次调用 os.path.join。 字符串操作:缺乏路径语义,容易因拼写错误引发问题。 |
4.如何选择?
- 推荐 Pathlib:
若项目使用 Python 3.4+,优先选择 Path 对象。它更简洁、安全,符合现代 Python 实践。
- 使用 os.path 的场景:
维护旧代码库或需兼容旧版 Python 时。
5.总结
两种方式功能一致,选择取决于项目环境(Python版本) 和开发者偏好。Pathlib 是未来趋势,推荐在新项目中优先使用。


5021

被折叠的 条评论
为什么被折叠?



