网站通常需要提供额外的文件,如图像、JavaScript或CSS。在Django中,我们将这些文件称为“静态文件”。Django提供 django.contrib.staticfiles
帮助你管理它们。
本页介绍如何为这些静态文件提供服务。
确保 django.contrib.staticfiles
包含在您的 INSTALLED_APPS
.
在设置文件中,定义 STATIC_URL
例如:
STATIC_URL = "static/"
在模板中,使用 static
模板标记,以使用配置的 staticfiles
STORAGES
别名。
{% load static %}
<img src="{% static 'my_app/example.jpg' %}" alt="My image">
将静态文件存储在名为 static
在你的应用程序中。例如 my_app/static/my_app/example.jpg
.
提供文件
除了这些配置步骤之外,您还需要实际服务于静态文件。
在开发过程中,如果您使用 django.contrib.staticfiles
,这将由自动完成 runserver
什么时候? DEBUG
设置为 True
(见 django.contrib.staticfiles.views.serve()
)
这种方法是 效率极低 而且可能 不安全的 就是这样 不适合生产 .
见 如何部署静态文件 为生产环境中的静态文件提供适当的策略。
您的项目可能还具有与特定应用程序无关的静态资产。除了使用 static/
目录在应用程序中,您可以定义目录列表 (STATICFILES_DIRS
)在设置文件中,Django还将查找静态文件。例如::
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
有关 STATICFILES_FINDERS
如何设置详细信息 staticfiles
查找您的文件。
静态文件名间距
现在我们 might 能够直接将静态文件放入 my_app/static/
(而不是创建另一个 my_app
),但这实际上是一个坏主意。Django将使用它找到的第一个名称匹配的静态文件,并且如果您在 different 应用程序中,Django将无法区分它们。我们需要能够将Django指向正确的位置,确保这一点的最佳方法是 namespacing 他们也就是说,通过将这些静态文件放入其中 another 为应用程序本身命名的目录。
您可以在中命名静态资产 STATICFILES_DIRS
通过指定 prefixes 。
如果你使用 django.contrib.staticfiles
如上所述, runserver
当 DEBUG
设置为 True
. 如果你没有 django.contrib.staticfiles
在里面 INSTALLED_APPS
,您仍然可以使用 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
.
最后,静态文件通过WSGI应用层的包装器提供。因此,静态文件请求不会通过正常 middleware chain 。
在开发过程中,您可以从 MEDIA_ROOT
使用 django.views.static.serve()
查看。
这不适合生产使用!有关一些常见的部署策略,请参见 如何部署静态文件 .
例如,如果您的 MEDIA_URL
被定义为 media/
,您可以通过将以下代码片断添加到 ROOT_URLCONF
**
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
备注
此帮助器函数仅在调试模式下工作,并且仅当给定的前缀是本地的(例如 media/
),而不是URL(例如 http://media.example.com/
)。
运行使用实际HTTP请求而不是内置测试客户机的测试时(即使用内置测试客户机时 LiveServerTestCase
)静态资产需要与其他内容一起使用,因此测试环境尽可能忠实地复制真实的内容,但是 LiveServerTestCase
只有非常基本的静态文件服务功能:它不知道 staticfiles
应用程序并假定静态内容已在 STATIC_ROOT
.
因为这个, staticfiles
船舶自己 django.contrib.staticfiles.testing.StaticLiveServerTestCase
是内置测试的一个子类,它能够在执行这些测试期间透明地服务于所有资产,其方式与我们在开发时使用的方式非常相似。 DEBUG = True
也就是说,不必使用 collectstatic
第一。
django.contrib.staticfiles
提供了一个方便的管理命令,用于在单个目录中收集静态文件,以便您可以轻松地为它们提供服务。
设置 STATIC_ROOT
设置为要从中提供这些文件的目录,例如:
STATIC_ROOT = "/var/www/example.com/static/"
运行 collectstatic
管理命令:
$ python manage.py collectstatic
这会将静态文件夹中的所有文件复制到 STATIC_ROOT
目录。
使用您选择的Web服务器来提供文件。 如何部署静态文件 介绍静态文件的一些常见部署策略。
本文档介绍了一些基础知识和一些常见的使用模式。有关中包含的所有设置、命令、模板标记和其他项的完整详细信息 django.contrib.staticfiles
见 the staticfiles reference .
7月 22, 2024