我是一个正在学习Django项目的初学者。一个Django项目的Settings.py文件包含以下两行代码:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
我想知道它们的区别,因为我认为它们都指向同一个目录。如果您能提供一些os.path函数的链接,那将是很大的帮助。
我是一个正在学习Django项目的初学者。一个Django项目的Settings.py文件包含以下两行代码:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
我想知道它们的区别,因为我认为它们都指向同一个目录。如果您能提供一些os.path函数的链接,那将是很大的帮助。
BASE_DIR
指向 PROJECT_ROOT
的父目录。你可以将这两个变量定义改写为:
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(PROJECT_ROOT)
因为 os.path.dirname()
函数 只是简单地删除路径的最后一段。
在上面的代码中,__file__
指向当前模块的文件名,参见Python 数据模型:
__file__
是加载模块的文件的路径名(如果它是从文件中加载的)。
但是,它可以是一个相对路径,因此在删除文件名并将完整路径存储到模块所在目录的 PROJECT_ROOT
中之前,需要使用 os.path.abspath()
函数 将其转换为绝对路径。
django-admin startproject my_new_app
命令启动了您的项目,那么它将创建以下层次结构。my_new_app
|
└───my_new_app
│ │
│ │ settings.py
│ │ ...
| manage.py
os.path.abspath(__file__)
返回 settings.py
文件的绝对路径,os.path.dirname(os.path.abspath(__file__))
返回内部 my_new_app
文件夹的路径,os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
返回外部 my_new_app
文件夹的路径。pathlib
模块代替 os
,因此等效的构造如下:from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
PROJECT_ROOT = Path(__file__).resolve().parent
settings.py
已经位于您的环境根目录中(例如本地机器上的C驱动器),使其路径看起来像C:\settings.py
,那么BASE_DIR == PROJECT_ROOT
可能为True。这可能不是正确的设置,所以如果BASE_DIR和PROJECT_ROOT相同,那么您可能需要重新组织您的项目。