如何管理静态文件(例如图像、JavaScript、CSS)¶
网站通常需要提供其他文件,例如图像、JavaScript 或 CSS。在 Django 中,我们将这些文件称为“静态文件”。Django 提供了 django.contrib.staticfiles
来帮助您管理它们。
此页面介绍如何提供这些静态文件。
配置静态文件¶
确保
django.contrib.staticfiles
包含在您的INSTALLED_APPS
中。在您的设置文件中,定义
STATIC_URL
,例如STATIC_URL = "static/"
在您的模板中,使用
static
模板标签,使用配置的staticfiles
STORAGES
别名来构建给定相对路径的 URL。{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
将您的静态文件存储在应用程序中名为
static
的文件夹中。例如my_app/static/my_app/example.jpg
。
提供文件
除了这些配置步骤外,您还需要实际提供静态文件。
在开发过程中,如果您使用 django.contrib.staticfiles
,当 DEBUG
设置为 True
时,runserver
会自动执行此操作(参见 django.contrib.staticfiles.views.serve()
)。
此方法**效率极低**,可能**不安全**,因此**不适合生产环境**。
请参阅 如何部署静态文件,了解在生产环境中提供静态文件的正确策略。
您的项目可能还有一些不与特定应用程序绑定的静态资源。除了在您的应用程序内使用 static/
目录外,您还可以在设置文件中定义目录列表(STATICFILES_DIRS
),Django 也会在其中查找静态文件。例如
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
有关 staticfiles
如何查找您的文件的详细信息,请参阅 STATICFILES_FINDERS
设置的文档。
静态文件命名空间
现在我们可能能够将静态文件直接放入 my_app/static/
(而不是创建另一个 my_app
子目录),但这实际上是一个坏主意。Django 将使用它找到的第一个名称匹配的静态文件,如果您在不同的应用程序中有一个同名的静态文件,Django 将无法区分它们。我们需要能够让 Django 指向正确的文件,确保这一点的最佳方法是命名空间它们。也就是说,将这些静态文件放在另一个以应用程序本身命名的目录中。
您可以通过指定 前缀 在 STATICFILES_DIRS
中为静态资源命名空间。
在开发过程中提供静态文件¶
如果您按照上述说明使用 django.contrib.staticfiles
,当 DEBUG
设置为 True
时,runserver
将自动执行此操作。如果您在 INSTALLED_APPS
中没有 django.contrib.staticfiles
,您仍然可以使用 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 应用程序层的包装器提供服务。因此,静态文件请求不会通过正常的 中间件链。
在开发过程中提供用户上传的文件¶
在开发过程中,您可以使用 django.views.static.serve()
视图从 MEDIA_ROOT
提供用户上传的媒体文件。
这**不适合生产环境使用!** 有关一些常见的部署策略,请参阅 如何部署静态文件。
例如,如果您的 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
中包含的所有设置、命令、模板标签和其他部分的完整详细信息,请参见静态文件参考。