BASE DIR的绝对路径是什么?

45 投票
8 回答
110436 浏览
提问于 2025-04-20 01:08

我是Django的新手,遇到了一些理解上的问题:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

还有

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')
STATICFILES_DIRS = (
    os.path.join(os.path.dirname(BASE_DIR), "static", "static"),
)

这里到底发生了什么呢?

我猜这里的“file”指的是我们正在使用的settings.py文件,对吧?所以BASE_DIR是从这个文件向上两层目录?也就是说,就是包含manage.py的那个文件夹?

那么STATIC_ROOT会是从BASE_DIR向上一个还是两个目录呢?STATIC_ROOT这个文件夹会自动为我创建吗?还是我需要自己创建一个叫“static”的文件夹?

└── MY_PROJECT
    ├── BASE_DIR
    │   ├── MY_APP
    │   │   └── settings.py
    │   └── manage.py
    └── static

以上的理解对这个例子来说正确吗?那么STATIC_FILES_DIRS到底在哪里呢?

8 个回答

1

在Django项目中,我使用以下代码来设置路径。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_PRODUCTION_DIR = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', 'static_production'))

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "static")

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "media")


STATICFILES_DIRS = [
   os.path.join(BASE_DIR, "static"),
]
2

这个回答是针对Python 3和Django 3.x写的。

在设置Django项目时,通常会有不同的配置,比如dev(开发环境)、prod(生产环境)和可能还有test(测试环境)。这些配置通常会从一个叫base的基础配置继承,而这个基础配置是在一个名为your_app_name/settings/base.py的文件中定义的。在base.py文件里,BASE_DIR可能会这样定义:

BASE_DIR = Path(__file__).resolve().parent.parent.parent

使用manage.py shell这个命令时,可以通过-c选项输入一行代码来执行。这里有一个一行代码的解决方案,可以显示一个名为frobshop的Django应用的BASE_DIR

$ ./manage.py shell -c 'from frobshop.settings import base; print(f"BASE_DIR={base.BASE_DIR}")'
BASE_DIR=/var/work/django/frobshop

我在我的Django笔记博客页面中提供了更多信息。

25

如果你的settings.py文件配置成这样,你的文件系统看起来就是这样的:

└── MY_PROJECT
    ├── BASE_DIR
    │   ├── MY_APP
    │   │   └── settings.py
    │   └── manage.py
    └── static        -> STATIC_ROOT
        └── static    -> STATICFILES_DIRS

不过,这样的配置并不好,因为它把收集到的静态文件和Django用来查找静态文件的目录搞混了(比如说,Django需要收集这些文件)。可能更好的做法是使用下面这个配置:

└── MY_PROJECT
    └── BASE_DIR
        ├── my_app
        │   ├── settings.py
        │   └── static              -> STATICFILES_DIRS
        ├── manage.py
        └── deployment
            ├── collected_static    -> STATIC_ROOT
            └── media               -> MEDIA_ROOT

# settings.py
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (os.path.join(
    BASE_DIR, "my_app", "static"),)
STATIC_ROOT = os.path.join(
    os.path.dirname(BASE_DIR), "deployment", "collected_static")
MEDIA_ROOT = os.path.join(
    os.path.dirname(BASE_DIR), "deployment", "media")

现在你可以很方便地使用你喜欢的网页服务器(比如Apache、Nginx等)来部署你的静态文件和媒体文件,只需要指向“deployment”目录就可以了。

更新:

我还添加了一个推荐的MEDIA_ROOT配置,并且修改了收集静态文件的路径。

75

BASE_DIR就是你的Django项目的文件夹,也就是存放manage.py这个文件的地方。

40

如果你想知道 BASE_DIR 的位置,可以在终端打印出来,只需在你的 settings.py 文件中添加这一行:

print "base dir path", BASE_DIR

然后运行服务器就能看到结果了。

撰写回答