Django静态(settings.STATIC_URL,document_root = settings.STATIC_ROOT)实际上有什么作用?

时间:2019-05-29 02:57:40

标签: python django django-settings

我正在使用Django 2.2。从Django 管理静态文件 documentation

  

如果如上所述使用django.contrib.staticfiles,请运行服务器   当DEBUG设置为True时,它将自动执行此操作。如果没有   在INSTALLED_APPS中有django.contrib.static文件,您仍然可以   使用django.views.static.serve()手动提供静态文件   视图。

     

这不适合生产使用!对于一些常见的部署   策略,请参阅部署静态文件。

     

例如,如果您的STATIC_URL定义为/ static /,则可以执行   通过将以下代码段添加到您的urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
  

注意

     

此帮助器功能仅在调试模式下且仅在给定   前缀是本地(例如/ static /),而不是URL(例如   http://static.example.com/

     

此帮助程序功能仅提供实际的STATIC_ROOT文件夹;   它不会执行像   django.contrib.staticfiles。

我的解释

  1. static是一个辅助功能,可在开发过程中为STATIC_ROOT 中的文件提供服务(是真的吗?)
  2. static仅在debug = True
  3. 时有效
  4. static仅适用于本地前缀,例如STATIC_URL = '/static/'
  5. DEBUG设置为True且我按照文档中的说明使用并设置了staticfiles应用程序时,如果我执行python manage.py runserver来启动本地服务器,则将自动处理提供的静态文件(是?)

我的问题

  1. static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)添加到项目的urls.py中到底能做什么?
  2. static是从STATIC_ROOT目录本地提供静态文件吗?为了测试这一理论,在运行collectstatic之后,我删除了static目录,以查看静态文件是否仍然可以正常加载(来自STATIC_ROOT),并且不要加载!为什么?
  3. 如何验证,Django正在从我的STATIC_ROOT位置加载静态文件...而不是从项目和应用程序中的静态目录加载?
  4. 如果Django自动提供静态文件(在文档中有提及),为什么需要在static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)上添加urlpatterns

示例

Example Django Project

settings.py

DEBUG = True

...

INSTALLED_APPS = [
    'django.contrib.admin',
    ...
    'django.contrib.staticfiles',
    'puppies.apps.PuppiesConfig'
]

...

STATIC_URL = '/static/'

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

STATIC_ROOT = 'c:/lkdsjfkljsd_cdn'

在我所有的模板中,我都使用{% load static %}

然后我做的:python manage.py collectstatic

STATIC_ROOT

在这一点上,是否在urls.py中包含以下内容似乎并不重要-我的静态文件仍然加载,但我不知道它们是否来自我项目的静态目录或我的STATIC_ROOT(c:/ lkdsjfkljsd_cdn):

if settings.DEBUG is True:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

最后,如果我删除项目中的那些静态目录,则所有的CSS,JS和图像均无法正常工作,这使我相信Django项目正在从项目的静态目录而不是STATIC_ROOT加载静态文件。

所以,再次,我如何告诉Django从我的STATIC_ROOT位置加载静态文件...而不是从我的项目和应用程序中的静态目录加载?还是我误解了Django不应该从本地STATIC_ROOT位置加载文件?

*编辑(添加HTML图像)

HTML

1 个答案:

答案 0 :(得分:1)

我认为您正在混淆一些事情。让我澄清一下。

static:

根据文档,它提供了用于提供静态文件的URL模式。如果您转到implementation,则会看到:

return [
        re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs),
]

它的作用是,它从前缀的左边删除正斜杠(即将/static/转换为static/),然后有一个视图(serve)来执行拉文件。

serve:

此功能执行投放文件。它将从文档根目录提供文件。

runserver:

runserver命令运行django开发服务器。如果您在 django.contrib.staticfiles 中安装了INSTALLED_APPS,则它将自动提供静态文件。如果您不希望投放静态广告,请使用runserver --nostaticcollectstaticSTATIC_ROOT与该命令无关。

collectstatic

此命令从不同的STATIC_DIRS收集所有静态文件,并将它们放在STATIC_ROOT定义的文件夹中。 collectstatic在生产部署中非常有用,当您使用反向代理服务器(如NGINX或Apache等)时。NGINX/ Apache / Varnish使用该文件夹(其中collectstatic存储静态文件)作为根目录并从中提供静态信息。不建议在生产中使用runserver。您可以使用gunicorn / uwsgi服务django。但是gunicorn / uwsgi不提供静态文件,因此使用反向代理服务器提供静态文件。

finally:

要回答您的问题:

  1. 否,除非您没有在django.contrib.staticfiles中添加INSTALLED_APPS,否则不必将其放入代码中。

  2. 您不需要。 STATIC_ROOT用于不同目的

  3. 不是。但是,要提供MEDIA文件,您可以添加以下模式:

    if settings.DEBUG:
        urlpatterns += [
            re_path(r'^media/(?P<path>.*)$', serve, {
                'document_root': settings.MEDIA_ROOT,
            }),
        ]
    

在生产中,媒体文件也应由反向代理服务器提供。