我正在使用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。
我的解释
STATIC_ROOT
中的文件提供服务(是真的吗?)debug = True
STATIC_URL = '/static/'
DEBUG
设置为True且我按照文档中的说明使用并设置了staticfiles应用程序时,如果我执行python manage.py runserver
来启动本地服务器,则将自动处理提供的静态文件(是?)我的问题
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
添加到项目的urls.py
中到底能做什么?STATIC_ROOT
目录本地提供静态文件吗?为了测试这一理论,在运行collectstatic
之后,我删除了static
目录,以查看静态文件是否仍然可以正常加载(来自STATIC_ROOT),并且不要加载!为什么?static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
上添加urlpatterns
?示例
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
在这一点上,是否在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图像)
答案 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 --nostatic
。 collectstatic
或STATIC_ROOT
与该命令无关。
collectstatic
:此命令从不同的STATIC_DIRS
收集所有静态文件,并将它们放在STATIC_ROOT
定义的文件夹中。 collectstatic
在生产部署中非常有用,当您使用反向代理服务器(如NGINX或Apache等)时。NGINX/ Apache / Varnish使用该文件夹(其中collectstatic存储静态文件)作为根目录并从中提供静态信息。不建议在生产中使用runserver
。您可以使用gunicorn / uwsgi服务django。但是gunicorn / uwsgi不提供静态文件,因此使用反向代理服务器提供静态文件。
finally:
要回答您的问题:
否,除非您没有在django.contrib.staticfiles
中添加INSTALLED_APPS
,否则不必将其放入代码中。
否
您不需要。 STATIC_ROOT用于不同目的
不是。但是,要提供MEDIA文件,您可以添加以下模式:
if settings.DEBUG:
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
在生产中,媒体文件也应由反向代理服务器提供。