django static static url static root

use*_*563 110 django django-urls django-staticfiles

我很困惑static root,想澄清一些事情.

为了服务于Django的静态文件,下面应该是settings.pyurls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)
Run Code Online (Sandbox Code Playgroud)

1.应该收集静态文件的目录的绝对路径

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
Run Code Online (Sandbox Code Playgroud)

2.静态文件的URL前缀

STATIC_URL = '/static/'
Run Code Online (Sandbox Code Playgroud)

3.静态文件的其他位置

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
Run Code Online (Sandbox Code Playgroud)

......并在urls.py以下几行中:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))
Run Code Online (Sandbox Code Playgroud)

我们也用 python manage.py collectstatic

问题:

  1. 任何人都可以向我解释工作流程:如何理想地完成工作.到目前为止,我将上面的代码片段复制/粘贴到他们指定的位置,并继续在静态目录中创建新文件,它可以工作.settings.STATIC_ROOT然而,在我看来,我指的是另一个目录.

  2. 如果有人能够解释每个设置的工作流程,那将是很好的:如何收集和管理文件,以及遵循什么样的好习惯.

谢谢.

suh*_*lvs 75

STATIC_ROOT

./manage.py collectstatic将收集静态文件以进行部署的目录的绝对路径. 例:STATIC_ROOT="/var/www/example.com/static/"

现在,该命令./manage.py collectstatic将所有静态文件(即应用程序中的静态文件夹,所有路径中的静态文件)复制到目录/var/www/example.com/static/.现在你只需要在apache或nginx..etc上提供这个目录.

STATIC_URL

URL其中的静态文件STATIC_ROOT目录供应(由Apache或nginx..etc). 示例:/static/http://static.example.com/

如果设置了STATIC_URL = 'http://static.example.com/',那么你就必须服务于STATIC_ROOT文件夹(即"/var/www/example.com/static/"由Apache或nginx的在URL) 'http://static.example.com/'(这样你可以参考静态文件'/var/www/example.com/static/jquery.js''http://static.example.com/jquery.js')

现在在您的django-templates中,您可以通过以下方式引用它:

{% load static %}
<script src="{% static "jquery.js" %}"></script>
Run Code Online (Sandbox Code Playgroud)

这将呈现:

<script src="http://static.example.com/jquery.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • @macdonjo既有`{{STATIC_URL}} jquery.js`又有`{%static'jquery.js"%}`是一样的.即两者都将返回`/ static/jquery.js`.[较新的django](https://docs.djangoproject.com/en/dev/howto/static-files/)版本建议使用`{%static"jquery.js"%}`,但是你需要加载templatetag ,即`{%load staticfiles%}`.在[较旧的django](https://docs.djangoproject.com/en/1.4/howto/static-files/)版本推荐`{{STATIC_URL}}` (6认同)

ken*_*eni 29

STATICFILES_DIRS:您可以在此处保留项目的静态文件,例如模板使用的静态文件.

STATIC_ROOT:将其留空,当您这样做时manage.py collectstatic,它将搜索系统上的所有静态文件并将其移动到此处.您的静态文件服务器应该映射到该文件夹​​,无论它位于何处.运行collectstatic后检查它,你会发现django已经构建的目录结构.

- - - - 编辑 - - - - - - - -

正如@DarkCygnus指出的那样,STATIC_ROOT应该指向文件系统上的一个目录,该文件夹应该是空的,因为它将由Django填充.

STATIC_ROOT = os.path.join(BASE_DIR,'staticfiles'))

要么

STATIC_ROOT ='/ opt/web/project/static_files

"

--------结束编辑-----------------

STATIC_URL:'/ static /'通常很好,它只是静态文件的前缀.

  • 这里是1.3 https://docs.djangoproject.com/en/1.3/howto/static-files/中静态文件管理的链接 (2认同)
  • `STATICFILES_DIRS`应作为静态文件的附加目录.如果将所有css/js/images放入APP_NAME/static/APP_NAME文件夹,则无需指定`STATICFILES_DIRS`. (2认同)

小智 11

2023 年 8 月更新:

\n

首先,我解释一下STATIC_ROOT,然后解释一下 [STATIC_URL 2

\n

<静态根>

\n

STATIC_ROOT可以设置一个文件夹路径,并与下面的命令一起使用,将 Django 项目中的 apps 和 admin 的静态文件收集到该文件夹​​路径中。*STATIC_ROOT永远不会影响STATIC_URL

\n
python manage.py collectstatic \n
Run Code Online (Sandbox Code Playgroud)\n

并且STATIC_ROOT仅适用于生产模式,即DEBUG = False,如下所示:

\n
# "core/settings.py"\n\nDEBUG = False // Production Mode\n
Run Code Online (Sandbox Code Playgroud)\n

现在,我们有一个 django 项目,其中的静态文件core.js位于core文件夹 where settings.pyis 和文件myapp.cssmyappwhich is a app中,如下所示:

\n

在此输入图像描述

\n

以及文件夹中的cssfontsimgjs文件夹,如下所示。*我使用为此 django 项目命名的虚拟环境,因此管理的静态文件位于其中,文件夹的相对路径为:adminvenvvenvadminvenv/lib/python3.8/site-packages/django/contrib/admin/static/admin/

\n

在此输入图像描述

\n

然后,我们将我的例子中 Windows 上BASE_DIR / \'static/\'的设置为。另外,我们设置是因为正如我之前所说,仅适用于生产模式C:\\Users\\kai\\django-project\\staticSTATIC_ROOTDEBUG = FalseSTATIC_ROOT

\n
# "core/settings.py"\n\nDEBUG = False // Production Mode\n\nSTATIC_ROOT = BASE_DIR / \'static/\' # Here\nSTATIC_URL = \'static/\'\n
Run Code Online (Sandbox Code Playgroud)\n

现在,我们运行以下命令:

\n
python manage.py collectstatic \n
Run Code Online (Sandbox Code Playgroud)\n

然后,static创建文件夹cssfonts并将文件夹**和img文件夹中的文件js夹收集到文件夹中,如下所示,但正如我们所见,文件夹中没有收集到文件夹中,如下所示,因为正如我之前所说,该命令收集静态来自 django 项目中的应用程序和管理员的文件,但其中的文件夹不是应用程序和管理员。这就是为什么文件夹中没有收集到文件夹中的原因:adminmyapp.cssmyappstaticcore.jscorestaticpython manage.py collectstaticcoresettings.pycore.jscorestatic

\n

在此输入图像描述

\n

但是,有一种方法可以将文件夹收集到core.js文件夹中。为此,我们需要将Windows 上的STATICFILES_DIRS设置为STATICFILES_DIRS,如下所示:corestaticBASE_DIR / \'core/static/\'C:\\Users\\kai\\django-project\\core\\staticsettings.py

\n
python manage.py collectstatic \n
Run Code Online (Sandbox Code Playgroud)\n

或者,我们需要设置coreINSTALLED_APPS,如下settings.py所示:

\n
# "core/settings.py"\n\nDEBUG = False\n\nSTATICFILES_DIRS = [ # Here\n    BASE_DIR / \'core/static/\'\n]\n\nSTATIC_ROOT = BASE_DIR / \'static/\'\nSTATIC_URL = \'static/\'\n
Run Code Online (Sandbox Code Playgroud)\n

现在,我们再次运行以下命令:

\n
# "core/settings.py"\n\nDEBUG = False\n\nINSTALLED_APPS = [\n    \'core\', # Here\n]\n
Run Code Online (Sandbox Code Playgroud)\n

然后输入yes回车即可覆盖现有static文件夹:

\n
\n

您已请求在设置中指定的\nas目标位置收集静态文件:

\n

C:\\Users\\kai\\django-project\\static

\n

这将覆盖现有文件!你确定你要这么做吗?

\n

输入“yes”继续,或输入“no”取消:yes

\n
\n

现在,core.jsincore文件夹被收集到static文件夹中,如下所示:

\n

在此输入图像描述

\n

<STATIC_URL>

\n

接下来我就解释一下STATIC_URL

\n

STATIC_URL可以将静态文件 URL 的前目录部分设置在静态文件 URL 的主机部分和文件部分之间,如下所示。*STATIC_URL永远不会影响STATIC_ROOT:

\n
python manage.py collectstatic \n
Run Code Online (Sandbox Code Playgroud)\n

例如我们设置\'static/\'STATIC_URLinsettings.py如下图所示。*STATIC_URL适用于开发模式和生产模式DEBUG = TrueDEBUG = False

\n
       |     Host      |   Directory    |  File  |\n       |               |Front |  Back   |        |\n        <-------------> <----> <-------> <------>      \nhttps://www.example.com/static/admin/css/base.css\n
Run Code Online (Sandbox Code Playgroud)\n

然后,打开 Django 管理:

\n

在此输入图像描述

\n

然后,按F12打开开发者工具,从Sources中检查当前打开的Django Admin页面使用的资源,其中有我们刚刚收集到文件夹中的admin静态文件static

\n

在此输入图像描述

\n

然后,将鼠标悬停base.csscss检查 URL:

\n

在此输入图像描述

\n

正如我们所看到的,我们可以设置前面的目录部分static

\n
# "core/settings.py"\n\nDEBUG = False\n\nSTATICFILES_DIRS = [\n    BASE_DIR / \'core/static/\'\n]\n\nSTATIC_ROOT = BASE_DIR / \'static/\'\nSTATIC_URL = \'static/\' # Here\n
Run Code Online (Sandbox Code Playgroud)\n

www.example.com并且,下面的 URL 是在with的情况下https

\n
                       Here  \n                     <------>\nhttp://localhost:8000/static/admin/css/base.css\n
Run Code Online (Sandbox Code Playgroud)\n

并且,我们可以将前面的目录部分更改statichello/world.

\n

因此,只需将其更改STATIC_URL为 ,\'static/\'如下\'hello/world/\'所示:

\n
                         Here\n    \xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80<------>\nhttps://www.example.com/static/admin/css/base.css\n
Run Code Online (Sandbox Code Playgroud)\n

然后,刷新 Django 管理页面:

\n

在此输入图像描述

\n

然后,将前面的目录部分static改为hello/world如下所示:

\n
# "core/settings.py"\n\nDEBUG = False\n\nSTATICFILES_DIRS = [\n    BASE_DIR / \'core/static/\'\n]\n\nSTATIC_ROOT = BASE_DIR / \'static/\'\nSTATIC_URL = \'hello/world/\' # Here\n
Run Code Online (Sandbox Code Playgroud)\n