如何管理静态文件(例如图像、JavaScript、CSS)¶
网站通常需要提供其他文件,例如图像、JavaScript 或 CSS。在 Django 中,我们将这些文件称为“静态文件”。Django 提供了 django.contrib.staticfiles 来帮助您管理它们。
此页面介绍如何提供这些静态文件。
配置静态文件¶
确保
django.contrib.staticfiles包含在您的INSTALLED_APPS中。在您的设置文件中,定义
STATIC_URL,例如STATIC_URL = "static/"
在您的模板中,使用
static模板标签,使用配置的staticfilesSTORAGES别名来构建给定相对路径的 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中包含的所有设置、命令、模板标签和其他部分的完整详细信息,请参见静态文件参考。