BASE DIR的绝对路径是什么?
我是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 个回答
在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"),
]
这个回答是针对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笔记博客页面中提供了更多信息。
如果你的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配置,并且修改了收集静态文件的路径。
BASE_DIR就是你的Django项目的文件夹,也就是存放manage.py这个文件的地方。
如果你想知道 BASE_DIR 的位置,可以在终端打印出来,只需在你的 settings.py 文件中添加这一行:
print "base dir path", BASE_DIR
然后运行服务器就能看到结果了。