我是 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
的parent目录。您可以将这两个定义重写为:
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(PROJECT_ROOT)
os.path.dirname()
函数 只是删除路径的最后一段。
上面的
__file__
名称指向当前模块的文件名,参见Python数据模型:
是加载模块的文件的路径名(如果是从文件加载的话)。__file__
os.path.abspath()
函数用于将其转换为绝对路径,然后仅删除文件名并将模块所在目录的完整路径存储在PROJECT_ROOT
中.
假设您使用
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
文件夹的路径。
在 Django 的最新版本(例如版本 4.2.5)中,使用
os
模块代替 pathlib
,因此等效的构造是:
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 相同,那么您可能需要重新构建您的项目。