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"),
)

这里发生了什么?

我认为"文件"是我们所在的settings.py文件(?),所以BASE_Dir是从它起的两个文件夹。。。?即带有manage.py的那个?

那么STATIC_ROOT,会是一个吗?还是两个?从BASE_DIR向上的目录。STATIC_ROOT文件夹会为我制作吗?还是我必须制作一个名为"静态"的?

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

上面的例子对吗?那么STATIC_FILES_DIRS到底在哪里?

BASE_DIR是您的Django项目目录。manage.py所在的同一目录。

如果您想知道BASE_DIR的位置,您可以将其打印到终端,只需将此行添加到您的设置中即可。py:

print "base dir path", BASE_DIR

和运行服务器以查看结果。

如果您的settings.py是这样配置的,那么您的文件系统看起来是这样的:

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

但这不是一个好的配置,因为它混合了收集的静态文件和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")

现在,您可以使用您喜欢的指向"部署"目录的Web服务器(Apache、Nginx等)轻松部署静态和媒体文件。

更新:

我还为MEDIA_ROOT添加了一个推荐的配置,并更改了收集的静态的路径。

这个答案是为Python 3和Django 3.x编写的。

devprod以及test设置设置Django项目是很常见的。这些设置通常继承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 Notes博客页面中提供了更多信息。

对于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"),
]

我所做的真正帮助我的是:

  1. 转到settings.py并添加-->STATICILES_DIRS=文件末尾的[os.path.join(BASE_DIR,'static')]。

  2. 转到你的模板文件夹中的基本html模板,并在标题部分添加这2行(只需确保你在static中创建了一个文件夹。在我的情况下,它是css,如下所示,可能是不同的名称):

    a) {%加载静态%}b)

如果其中包含您不知道它在哪里或如何工作的路径,只需在文件print('my directory', UNKNOWN_DIR)的底部键入即可,然后在终端Python manage.py runserver中运行。

'my directory'只是一个你可以在任何字符串中键入的字符串,那么UNKNOWN_DIR就是你想知道的。然后运行Python manage.py runserver

示例:

打印('my-path',(os.path.abspath(文件))

python manage.py runserver

print('my-path',(os.path.dirname(os.part.abspath(文件)))

python manage.py runserver

print('my-path',os.path.join(BASE_DIR,'staticfiles'))

python manage.py runserver

将下面的代码添加到"settings.py",这样你就可以看到";BASE_DIR"在您的控制台上:

# "settings.py"
print("BASE_DIR is", BASE_DIR)

最新更新