如何管理静态文件(例如图像、JavaScript、CSS)

网站通常需要提供其他文件,例如图像、JavaScript 或 CSS。在 Django 中,我们将这些文件称为“静态文件”。Django 提供了 django.contrib.staticfiles 来帮助您管理它们。

此页面介绍如何提供这些静态文件。

配置静态文件

  1. 确保 django.contrib.staticfiles 包含在您的 INSTALLED_APPS 中。

  2. 在您的设置文件中,定义 STATIC_URL,例如

    STATIC_URL = "static/"
    
  3. 在您的模板中,使用 static 模板标签,使用配置的 staticfiles STORAGES 别名来构建给定相对路径的 URL。

    {% load static %}
    <img src="{% static 'my_app/example.jpg' %}" alt="My image">
    
  4. 将您的静态文件存储在应用程序中名为 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 提供了一个方便的管理命令,用于将静态文件收集到单个目录中,以便您可以轻松地提供服务。

  1. STATIC_ROOT 设置设置为要从中提供这些文件的目录,例如

    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. 运行collectstatic 管理命令

    $ python manage.py collectstatic
    

    这会将所有文件从您的静态文件夹复制到STATIC_ROOT 目录。

  3. 使用您选择的 Web 服务器来提供文件。如何部署静态文件 涵盖了一些常见的静态文件部署策略。

了解更多

本文档介绍了基础知识和一些常见的用法模式。有关django.contrib.staticfiles中包含的所有设置、命令、模板标签和其他部分的完整详细信息,请参见静态文件参考

返回顶部