Django项目的settings.py文件包含以下两行:
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
我想知道两者的区别,因为我认为两者都指向同一个目录。另外,如果你能提供一些链接操作系统的路径函数,这将是很大的帮助。
9avjhtql1#
BASE_DIR指向PROJECT_ROOT的父目录。您可以将这两个定义重写为:
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 datamodel:__file__是加载模块的文件的路径名(如果模块是从文件加载的)。但是,它可以是一个 * 相对 * 路径,因此os.path.abspath()函数用于将其转换为绝对路径,然后仅删除文件名并将模块所在目录的完整路径存储在PROJECT_ROOT中。
os.path.dirname()
__file__
os.path.abspath()
kiayqfof2#
假设您使用django-admin startproject my_new_app命令启动项目,那么它将创建一个层次结构,如下所示。
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模块,所以等效的构造是:
os.path.abspath(__file__)
os.path.dirname(os.path.abspath(__file__))
my_new_app
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
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_ROOT和PROJECT_ROOT是相同的,那么你可能需要重新构建你的项目。
C:\settings.py
BASE_DIR == PROJECT_ROOT
2条答案
按热度按时间9avjhtql1#
BASE_DIR
指向PROJECT_ROOT
的父目录。您可以将这两个定义重写为:因为
os.path.dirname()
函数只是删除路径的最后一段。在上面,
__file__
名称指向当前模块的文件名,参见Python datamodel:__file__
是加载模块的文件的路径名(如果模块是从文件加载的)。但是,它可以是一个 * 相对 * 路径,因此
os.path.abspath()
函数用于将其转换为绝对路径,然后仅删除文件名并将模块所在目录的完整路径存储在PROJECT_ROOT
中。kiayqfof2#
假设您使用
django-admin startproject my_new_app
命令启动项目,那么它将创建一个层次结构,如下所示。然后,
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
模块,所以等效的构造是:有一种特殊情况,如果
settings.py
已经在您的环境的根目录中(例如,本地计算机上C驱动器),使其路径看起来像C:\settings.py
,则BASE_DIR == PROJECT_ROOT
可能为True。这可能不应该是这样的,所以如果BASE_ROOT和PROJECT_ROOT是相同的,那么你可能需要重新构建你的项目。